我想我正在尝试针对我正在开发的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会抛出异常。
所以我猜测如果我需要将元信息返回给客户端,我需要设计自己的响应类版本吗?
答案 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();
}