ОТДЫХ - Джерси - Обеспечение межсайтового доступа

Я думаю, что я пытаюсь сделать несколько вариантов дизайна относительно 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();
}
Другие вопросы по тегам