为了账号安全,请及时绑定邮箱和手机立即绑定

JAX-RS —如何一起返回JSON和HTTP状态代码?

JAX-RS —如何一起返回JSON和HTTP状态代码?

蝴蝶不菲 2019-10-14 09:47:09
我正在编写REST Web应用程序(NetBeans 6.9,JAX-RS,TopLink Essentials),并尝试返回JSON 和 HTTP状态代码。我已经准备好工作的代码,当从客户端调用HTTP GET方法时,该代码返回JSON。实质上:@Path("get/id")@GET@Produces("application/json")public M_機械 getMachineToUpdate(@PathParam("id") String id) {    // some code to return JSON ...    return myJson;}但是,我也想用JSON数据一起返回的HTTP状态代码(500,200,204,等)。我尝试使用HttpServletResponse:response.sendError("error message", 500);但是,这使浏览器认为它是“真实的” 500,因此输出网页是常规的HTTP 500错误页面。我想返回一个HTTP状态代码,以便我的客户端JavaScript可以处理一些依赖于它的逻辑(例如,在HTML页面上显示错误代码和消息)。这是可能的还是不应该将HTTP状态代码用于这种情况?
查看完整描述

3 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

凭空回答可以解决问题,但是它修改了整个方法,让诸如Jackson + JAXB之类的提供程序自动将您返回的对象转换为某种输出格式(如JSON)。受Apache CXF 帖子(使用特定于CXF的类)的启发,我发现了一种设置应在任何JAX-RS实现中都可以使用的响应代码的方法:注入HttpServletResponse上下文并手动设置响应代码。例如,以下是CREATED在适当时将响应代码设置为的方法。


@Path("/foos/{fooId}")

@PUT

@Consumes("application/json")

@Produces("application/json")

public Foo setFoo(@PathParam("fooID") final String fooID, final Foo foo, @Context final HttpServletResponse response)

{

  //TODO store foo in persistent storage

  if(itemDidNotExistBefore) //return 201 only if new object; TODO app-specific logic

  {

    response.setStatus(Response.Status.CREATED.getStatusCode());

  }

  return foo;  //TODO get latest foo from storage if needed

}

改进:找到另一个相关答案后,我了解到HttpServletResponse即使对于单例服务类(至少在RESTEasy中),也可以将其作为成员变量注入!!与用实现细节污染API相比,这是一种更好的方法。它看起来像这样:


@Context  //injected response proxy supporting multiple threads

private HttpServletResponse response;


@Path("/foos/{fooId}")

@PUT

@Consumes("application/json")

@Produces("application/json")

public Foo setFoo(@PathParam("fooID") final String fooID, final Foo foo)

{

  //TODO store foo in persistent storage

  if(itemDidNotExistBefore) //return 201 only if new object; TODO app-specific logic

  {

    response.setStatus(Response.Status.CREATED.getStatusCode());

  }

  return foo;  //TODO get latest foo from storage if needed

}


查看完整回答
反对 回复 2019-10-14
  • 3 回答
  • 0 关注
  • 775 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信