我想使用Jersey / JAX-RS使用不同的处理程序为同一个REST URL处理两种不同的媒体类型。这可能吗?
例如:
@Path("/foo")
public class FooHandler {
@POST
@Path("/x")
@Consumes("application/json")
public Response handleJson() {
}
@POST
@Path("/x")
@Consumes("application/octet-stream")
public Response handleBinary() {
}
}
答案 0 :(得分:3)
是的,这是可能的。确定资源方法有很多东西,媒体类型就是其中之一。客户端需要确保在发送请求时设置Content-Type
标头。
如果您想了解如何选择资源方法背后的确切科学知识,请阅读3.7 Matching Requests to Resource Methods in the JAX-RS spec。您可以在3.7.2-3.b中具体了解有关媒体类型的部分。
简单测试
@Path("myresource")
public class MyResource {
@POST
@Path("/x")
@Consumes("application/json")
public Response handleJson() {
return Response.ok("Application JSON").build();
}
@POST
@Path("/x")
@Consumes("application/octet-stream")
public Response handleBinary() {
return Response.ok("Application OCTET_STREAM").build();
}
}
@Test
public void testGetIt() {
String responseMsg = target.path("myresource")
.path("x").request().post(Entity.entity(null,
"application/octet-stream"), String.class);
System.out.println(responseMsg);
responseMsg = target.path("myresource")
.path("x").request().post(Entity.entity(null,
"application/json"), String.class);
System.out.println(responseMsg);
}
以上测试将始终打印出来
申请书OCTET_STREAM
应用程序JSON