REST - Jersey - 提供跨站点访问
Posted
技术标签:
【中文标题】REST - Jersey - 提供跨站点访问【英文标题】:REST - Jersey -Providing Cross Site Access 【发布时间】:2013-02-22 02:06:12 【问题描述】:我想我正在尝试对我正在开发的 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】: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();
【讨论】:
以上是关于REST - Jersey - 提供跨站点访问的主要内容,如果未能解决你的问题,请参考以下文章