使用JAX-RS消耗JSON字符串

Den*_*nis 5 java json jax-rs

由于RFC 7159,字符串可以是有效的JSON文档:

JSON-text = ws value ws
...
value = false / null / true / object / array / number / string
...
string = quotation-mark *char quotation-mark
Run Code Online (Sandbox Code Playgroud)

因此,有效的JSON可以"Hello World".

是否可以使用JAX-RS消耗这样的JSON字符串?

Wil*_*son 7

JAX-RS有一个@Consumes注释,用于指定客户端发送的资源可以使用的表示的MIME媒体类型.

以下是接受application/json媒体类型请求的示例:

@Path("/foo")
public class FooResource {

    @POST
    @Consumes("application/json")
    public Response bar(InputStream entity) {
        return Response.ok.build();
    }

}
Run Code Online (Sandbox Code Playgroud)

如果您发送标题为的请求,则状态Content-Type: application/json响应200 OK将返回给您.但是如果您发送带有标题的请求Content-Type: application/xml,406 Not Acceptable则会返回响应.这是因为@Consumes指定具有JSON的请求是可接受的而不是其他的.

您可以观察到@Consumes如何解析请求实体,但指定应接受的媒体类型.

您可以看到上面的示例有一个参数InputStream entity.它实际上是请求实体.您可以bar使用JSON解析器库解析资源方法,例如Jackson:

@POST
@Consumes("application/json")
public Response bar(InputStream entity) {
    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.readValue(inputStream, String.class);
    System.out.println(json);
    return Response.ok.build();
}
Run Code Online (Sandbox Code Playgroud)

如果您发送带有"Hello World"主体的请求,您将在控制台中看到"Hello World".这是因为Jackson知道如何解析RFC 7159中指定的JSON文档,而不是JAX-RS.

实际上,像RESTEasy这样的JAX-RS实现已经在流行的JSON解析器库中提供了JSON支持.因此,您只需创建一个资源方法,如下所示:

@POST
@Consumes("application/json")
public Response bar(String json) {
    System.out.println(json);
    return Response.ok.build();
}
Run Code Online (Sandbox Code Playgroud)

你应该得到相同的结果.

在幕后,JAX-RS具有MessageBodyReader,用于将HTTP请求体转换为Java对象.它是类提供从表示到相应Java类型的映射服务.例如,jackson-jaxrs-providers为JSON数据格式实现了JAX-RS MessageBodyReaderMessageBodyWriter处理程序.

有关JAX-RS的更多详细信息,您可以查看JSR-000339 JAX-RS 2.0规范


cas*_*lin 3

是的,有可能:

@Path("foo")
public class Foo {

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response biz(String json) {
        return Response.ok(json).build();
    }
}
Run Code Online (Sandbox Code Playgroud)

你的要求是这样的:

curl -X POST --header 'Content-Type: application/json' \
             --header 'Accept: application/json' \
             -d '"Hello World"' 'http://localhost:8080/api/foo'
Run Code Online (Sandbox Code Playgroud)