由于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字符串?
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 MessageBodyReader和MessageBodyWriter处理程序.
有关JAX-RS的更多详细信息,您可以查看JSR-000339 JAX-RS 2.0规范
是的,有可能:
@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)