gpt4 book ai didi

java webservice响应对象与Produces

转载 作者:搜寻专家 更新时间:2023-11-01 04:06:01 24 4
gpt4 key购买 nike

我正在尝试使用 java 网络服务并尝试遵循几个教程示例。

在其中一个示例中,我看到 @Produces 注释用于指定返回的响应类型。

例子:

@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHello() {
return "Hello Jersey";
}

但在另一种情况下,我看到 Response 对象被用作 Response...

例子:

@GET
@Path("/{param}")
public Response getMsg(@PathParam("param") String msg) {

String output = "Jersey say : " + msg;

return Response.status(200).entity(output).build();

}

问题:

  1. 哪个是发送回响应的正确方法 - Response 对象还是@Produces 注释?
  2. 何时可以使用这两种情况?

最佳答案

最好的方法是始终结合使用两者。这就是为什么

@Produces 基本上定义了响应的内容类型(MIME-TYPE)。但这几乎就是全部。它没有定义 HTTP 状态代码(错误/成功/服务器错误等)。 @Produces 注释通过不明确指定响应中的内容类型来使您的生活更轻松。

现在为什么要使用 Response 而不是“String”作为返回类型?这是一个例子

让我们考虑以下代码:

@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHello() {
try
{
return someRemoteServerApi.getHelloString();
}
catch(exception ex)
{
return getErrorMessageString();
}
}

现在假设远程服务器 api 无法返回,这导致了某种错误。现在,您想将错误连同错误代码一起返回给客户端(因为坦率地说,客户端在开发时只会关心错误消息字符串。一旦开发了客户端,他们将完全基于 HTTP 返回的 api状态代码)。

因此,在上面的示例中,假设您返回一个错误 json 字符串,例如 (getErrorMessageString()) :

{
"error":500
"message": "something went wrong"
}

但是,您的实际 HTTP 状态代码仍将是“200 OK”,因为响应仍然是一个字符串并且响应通过得很好。如果 API 出现问题,客户怎么知道?他将不得不解析 json 字符串(出错)并确定出了什么问题。

基本上,在上述情况下,您的成功和失败都会有相同的 HTTP 状态返回码,这对客户端的帮助不是很大。相反,上面的代码应该改变如下:

@GET
@Produces(MediaType.TEXT_PLAIN)
public Response sayPlainTextHello() {
try
{
return Response.status(200).entity(someRemoteServerApi.getHelloString()).build();
}
catch(exception ex)
{
return Response.status(500).entity(getErrorMessageString()).build();
}
}

最后,

关于回答您的两个问题:

1) @Produces 与将发送何种 Response 无关。它只是在您要发送的任何 Response 对象上设置内容类型。默认情况下,JAX-RS 将发出 200 OK 响应,当然,除非发生未捕获的异常。然后它可能会返回 500。基本上,您将依赖 JAX-RS 为您返回错误代码,这不是很好。作为实现者,您应该确定应该将哪种错误代码和错误消息发送给最有意义的客户端

2) 我将始终使用 Response 作为方法的返回类型,以及每个方法的 @Produces 和 @Consumes 注释。如果您认为您的完整资源(java 资源类中的所有方法)使用相同的@Produces 和@Consumes mime 类型(在大多数情况下它是 application/json),那么您可以在类级别本身定义它,沿着行:

@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/rest/someResource")
public class MyResource()
{
@Path("/{resourceId")
@GET
public Response getResource(@PathParam("resourceId") String id)
{
doStuffAndReturnResponse();
}
}

默认情况下,这会将 @produces 和 @consumes 注释应用于所有资源方法,如果您想要某些特定资源方法的特定内容,您可以通过为该特定方法提供注释来覆盖它。

希望我已经解释得足够好!编码愉快!

关于java webservice响应对象与Produces,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20826080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com