java - 使用 JAX-RS 使用 JSON 字符串

标签 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

因此,一个有效的 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();
    }

}

如果您发送一个 header 为 Content-Type: application/json 的请求,将返回一个状态为 200 OK 的响应。但是,如果您发送带有 Content-Type: application/xml header 的请求,将返回带有 406 Not Acceptable 的响应。这是因为 @Consumes 指定可以接受带有 JSON 的请求,但不接受其他请求。

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

可以看到上面的例子有一个InputStream实体的参数。它实际上是请求实体。您可以使用 JSON 解析器库在 bar 的资源方法中进行解析,例如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();
}

如果您发送带有“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();
}

你应该得到相同的结果。

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

关于JAX-RS的更多细节,可以查看JSR-000339 JAX-RS 2.0 Specification

关于java - 使用 JAX-RS 使用 JSON 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38125756/

相关文章:

java - 弹出窗口的背景变暗或模糊

java - 没有 volatile 成员的单例

java - 带有 Wildfly Swarm CORSFilter 的 REST API

python - python 中紧凑但漂亮的 JSON 输出?

php - 如何解决 cURL Post 不发布数据的问题?

exception - JAX-RS 请求异常期间出现 "No ' Access-Control-Allow-Origin ' header"错误

Java Guice DI 错误 : UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl

java - try-catch-finally 和其余的方法执行顺序

java - libtensorflow_jni 和 libtensorflow_jni_gpu jar 依赖项是否互斥?

python - 使用python从没有数据名称的json文件中提取url