【问题标题】:One request to servlet that can have two types of response一个对 servlet 的请求,可以有两种类型的响应
【发布时间】:2015-02-11 22:35:26
【问题描述】:

我的服务器上运行了一个线程(我正在使用 Tomcat 和 Java 文件),当用户发出请求时,服务器可以根据线程的状态以两种类型的响应进行响应。响应应该是 JSON,我使用的是 Jersey 库,Servlet 看起来像:

@GET
@Path("init")
@Produces(MediaType.APPLICATION_JSON)
public initResponse respondAsReady() {
    return initRes;
}

这只是一个示例,但问题是我仅限于使用一种类型的 JSON 响应(在本例中为 initResponse),但我需要能够返回另一种类型的响应(例如 initResponse2),即不同类型的 JSON。在其他情况下,我需要使用整数或 JSON 对象进行响应。那么如何构建我的后端,以便它可以处理请求并返回两个可能的响应?

【问题讨论】:

  • 命中:initResponse 不是有效的 Java 类名。
  • initResponse 是表示返回的 JSON 的类

标签: java json rest jersey


【解决方案1】:
@GET
@Path("init")
@Produces({MediaType.APPLICATION_JSON , MediaType.TEXT_PLAIN})
public Response respondAsReady() {
    if(/*condition*/)}
        //In case of a JSON response
        return Response.ok(json, MediaType.APPLICATION_JSON).build();
    }
    if(/*condition*/){
        //In case of an integer response
        return Response.ok(text, MediaType.TEXT_PLAIN).build();
    }
}

【讨论】:

  • 所以如果方法返回两个不同的 json 我应该这样做吗?: if(/*condition*/)} //如果是 JSON 响应返回 Response.ok(json, MediaType.APPLICATION_JSON) 。建造(); } if(/*condition*/){ //如果是整数响应返回 Response.ok(json2, MediaType.APPLICATION_JSON).build(); }
【解决方案2】:

你拥有的每个端点都应该有@Consumes注解,这个注解定义了资源类或MessageBodyReader的方法可以接受的媒体类型,你也需要使用@Produces这定义了媒体类型资源类或 MessageBodyWriter 的方法可以产生

@GET
@Path("init")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public InitResponse respondAsReady() {
    return new InitResponse;
}

@GET
@Path("init")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.TEXT_PLAIN)
public String respondAsReady() {
    return new String("5");
}

使用这件球衣根据请求中的 Accept 标头选择方法,因此请务必将其与您的请求一起发送。阅读此link 以了解更多信息

如果您的客户端仅接受“文本/纯文本”,则将执行第二个端点。刚刚超过 Accept 标头中的这个值。

【讨论】:

  • 在我的情况下,客户端不知道会出现哪个响应,因此您不能将其放在请求的标头中。响应类型在服务器端由服务器上运行的线程确定。
猜你喜欢
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 2016-08-01
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多