REST - Jersey-提供跨站点访问

时间:2013-03-07 01:50:12

标签: rest jersey jsonp

我想我正在尝试针对我正在开发的REST API做出一些设计选择。

- 提供跨站点访问是个好主意吗?换句话说,我应该允许JSONP回复。我倾向于提供JSOP响应,因为我猜测如果我不允许使用JSONP,那么在浏览器中运行的javascript客户端将无法访问我的API。如果你对这个想法有任何经验,我会很感激。

- 使用Jersey,我可以通过使用@Produces("application/javascript")注释我的方法并返回JSONWithPadding的实例来提供JSONP响应。像这样:

    @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)时,Jersey会抛出异常。

所以我猜测如果我需要将元信息返回给客户端,我需要设计自己的响应类版本吗?

1 个答案:

答案 0 :(得分:0)

JSONP有很多细节。有关详细信息,请查看What is JSONP all about?。此时,如果您想从其他域提供对API的JavaScript访问,那么就可以了。如果您的申请有意义,由您决定。

关于第二个问题,我一直这样做,为客户提供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();
}