Настройка типа контента Джерси - PullRequest
1 голос
/ 26 января 2012

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

В настоящее время я делаю стандартную вещь:

@Produces( {"application/xml", "application/json"}) 
public ContactsConverter getSearchContacts()

Так что по умолчанию я верну XML.Однако, если я хочу вернуть объект json, мне придется установить «Content-Type: application / json» в заголовке моего запроса.В настоящее время это не вариант для меня, потому что запрос поступает от междоменного вызова ajax, где тип содержимого всегда будет / .Поэтому я бы хотел использовать флаг в моем запросе или что-то умное, чтобы указать тип возвращаемого содержимого.Я огляделся, но ничего полезного не увидел, одно предложение - отправить json по умолчанию, но я бы хотел этого избежать.

1 Ответ

2 голосов
/ 15 декабря 2012

Ну, во-первых, я думаю, что Джерси делает не то, что здесь, так как Content-Type - это заголовок, который описывает содержимое запроса / ответа, и вы не включаете какой-либо контент в запрос. вместо этого будет основывать свое поведение на заголовке Accepts, но оставляя это в стороне ....

То, что это ajax-вызов, не означает, что тип контента всегда будет /, на клиенте вы можете вызвать setRequestHeader следующим образом:

var xhr = new XMLHttpRequest();
xhr.open("POST", "http://myjaxrs-server/getSearchContacts");
xhr.onreadystatechange = function() {
    /* normal javascript to deal with the response goes here */
};

xhr.setRequestHeader("Content-Type", "application/json");

xhr.send("data i'm posting");

Установка заголовка Content-Type в запросе CORS вызовет предполётный запуск. Вы должны поддержать предварительную проверку в коде сервера, иначе запрос CORS будет отклонен. Укажите ваш обычный код для getSearchContacts, но предварительная проверка включится методом OPTIONS:

@OPTIONS
public Response preflight(
    @HeaderParam("Access-Control-Request-Method") String requestMethod,
    @HeaderParam("Origin") String origin,
    @HeaderParam("Access-Control-Request-Headers") String requestHeaders) {
return Response
    .ok()
    .header("Access-Control-Allow-Origin", "*") // TODO replace with specific origin
    .header("Access-Control-Allow-Headers", "Content-Type")
    .build();
}

Теперь будет разрешен запрос CORS с пользовательскими заголовками.

Легко ошибиться: насколько я могу судить, даже API-интерфейс электронной таблицы Google не правильно реагирует на предварительные просмотры, а это означает, что вы не можете на самом деле изменить какие-либо данные из JavaScript.

...