ОТДЫХ - Джерси - Обеспечение межсайтового доступа
Я думаю, что я пытаюсь сделать несколько вариантов дизайна относительно REST API, над которым я работаю.
-Хорошо ли предоставлять межсайтовый доступ? Другими словами, должен ли я разрешить ответы JSONP. Я склоняюсь к предоставлению ответов JSOP, потому что я предполагаю, что если я не разрешу JSONP, то клиент javascript, работающий в браузере, не сможет получить доступ к моему API. Если у вас есть опыт "За" или "Против", я был бы признателен за это.
Используя Джерси, я могу предоставить ответ JSONP, пометив свои методы @Produces("application/javascript")
и возвращая экземпляр JSONWithPadding
, Вот так:
@GET
@Produces("application/javascript")
@Path("{film_id}")
public JSONWithPadding crossSitefilmWithID(
@DefaultValue(NO_ID) @PathParam("film_id") final String filmId,
@DefaultValue(CALLBACK) @QueryParam("callback") String callback) {
....
return new JSONWithPadding(films.get(id), callback);
}
Вышеприведенный пример работает, но я не могу понять, как я мог бы вернуть javax.ws.rs.core.Response
вместо этого (Джерси выбрасывает исключение, когда я JSONWithPadding(response, callback)
,
Итак, я предполагаю, что если мне нужно вернуть метаинформацию клиенту, мне нужно разработать собственную версию класса ответа?
1 ответ
Есть много входов и выходов с JSONP. Посмотрите, что такое JSONP? для дополнительной информации. На данный момент, если вы хотите предложить JavaScript доступ к вашему API из других доменов, это путь. Если это имеет смысл для вашего приложения, зависит от вас.
Что касается второго вопроса, я делаю это все время, чтобы предоставить клиентам XML, JSON и JSONP:
@GET
@Path("/thing")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, CustomMediaTypes.APPLICATION_JSONP})
public Response doThing(@QueryParam("callback") @DefaultValue("fn") String callback) {
// Do the thing
GenericEntity<MyThing> response = new GenericEntity<MyThing>(thing){};
return Response.ok(new JSONWithPadding(response, callback)).build();
}