Как динамически установить тип содержимого ответа в Spring Rest Controller? - PullRequest
0 голосов
/ 09 мая 2018

Я реализовал API, который будет возвращать как JSON, так и XML согласно запросу клиента (т. Е. Заголовок Accept в запросе). Работает как положено.

Проблема здесь в том, что даже если пользователь отправляет заголовок Accept, в некоторых особых случаях (например, бизнес-логика) нам необходимо динамически отправлять тип содержимого ответа. Я пытался реализовать его с помощью HttpHeaders, но он не работает.

@GetMapping
public ResponseEntity<Response> getQueries(){
...............

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    //headers.add("Content-Type", "application/json");  
    return new ResponseEntity<Response>(response, headers, HttpStatus.OK);
}

Я получаю HTTP-статус как 200, но отвечаю как ошибка, т.е.

Unexpected '<'

Как это исправить?

1 Ответ

0 голосов
/ 09 мая 2018

Ваш вопрос касается согласования содержимого, которое позволяет потребителю (вашему пользовательскому агенту) и поставщику (вашему контроллеру) с самого начала согласиться с типом ответа

Прежде всего, потребитель APi должен указать, какой медиатип (типы) он примет для ответа. Это делается путем установки заголовка Accept для требуемого типа (ов). Таким образом, в случае, когда потребитель ожидает тип ответа как JSON, заголовок Accept должен быть настроен с «application / json» или «application / xml» для XML (или любым конкретным вариантом каждого из них, таким как «application / xhtml + xml» и так).

На стороне контроллера необходимо указать поддерживаемые типы ответа, используя свойство аннотации «производит». Существует также одноуровневое свойство «потребляет», которое указывает поддерживаемый тип (ы) запроса. Ооо ... наше отображение должно выглядеть так:

@GetMapping(value="someEndpoint",
        produces={"application/json","application/xml"})
public ResponseEntity<Page<Person>> getPersons(
        @RequestParam(value = "page", required = true) Integer pPage,
        @RequestParam(value = "size", required = true) Integer pSize) 
{
    Page<Person>  result;
    result = personService.getPersons(new PageRequest(pPage, pSize));
    return new ResponseEntity<>(result, HttpStatus.OK);
}

Теперь интересная часть заключается в том, что вам не нужно беспокоиться о форматировании ответа, поскольку Spring сможет определить требуемый для клиента медиатип ответа на основе значения заголовка Accept http-запроса.

Еще лучше, с правильной конфигурацией, вы можете установить mediaType ответа по умолчанию, если в запросе нет заголовка Accept. Таким образом, установив тип содержимого ответа по умолчанию на «application / json», любой запрос без заголовка Accept будет обслуживаться в JSON, в то время как потребитель должен будет добавить Accept: «application / xml», чтобы тип ответа был xml.

См. Это Руководство по пружине , где приведены примеры и варианты этой темы и параметров конфигурации.

Надеюсь, это поможет,

Джейк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...