使用JAX-RS Jersey 2.2获取Content-Type和Accept标头的请求

Sha*_*ady 13 rest web-services content-type jax-rs jersey

我尝试访问一个开放的数据Web服务,它为我提供了流量信息.文档说请求必须是GET并且需要包含Accept: application/jsonContent-Type: application/json.我不明白为什么他们需要Content-Type但是确定:

我试图只用Accept:Header 检索数据,但我总是得到一个415 Unsupported Media Type.现在我正在尝试这种方式(但我不确定我是否真的正确设置两个标头):

String entity = ClientBuilder.newClient().target(liveDataURI)
    .path(liveDataPath)
    .request(MediaType.APPLICATION_JSON)
    .accept(MediaType.APPLICATION_JSON)
    .get(String.class);
Run Code Online (Sandbox Code Playgroud)

如你所见,我正在使用Jersey 2.2而且我还在使用415 Unsupported Media Type.

编辑

所以我开始工作,但我不明白为什么.是不是accept(MediaType.APPLICATION_JSON)header("Content-type","application/json")一样?

String responseEntity = ClientBuilder.newClient()
    .target(liveDataURI)
    .path(liveDataPath)
    .request(MediaType.APPLICATION_JSON)
    .header("Content-type", "application/json")
    .get(String.class);
Run Code Online (Sandbox Code Playgroud)

小智 16

Accept头告诉你的客户端希望服务器在响应.该Content-Type头告诉什么客户端向服务器发送的请求.所以两者一样.

如果服务器仅接受application/json,则必须发送指定请求内容的请求:

Content-Type: application/json
Run Code Online (Sandbox Code Playgroud)

这就是您编辑的代码有效的原因.

编辑

在您使用的第一个代码中WebTarget.request(MediaType... acceptedResponseTypes).这个方法的参数

定义接受的响应媒体类型.

您正在使用Innvocation.Builder.accept(MediaType... mediaTypes)此方法调用的结果.但是accept()没有添加新标题,在第一个代码中没有必要.

您从不指定请求的内容类型.由于服务器需要一个Content-Type标头,因此它会响应415.


ROM*_*eer 14

是不是accept(MediaType.APPLICATION_JSON)header("Content-type","application/json")一样?

不,他们是不同的.
这是他们的相关方式:

Client                     Server
(header)                   (class/method annotation)
====================================================
Accept          <--->      @Produces
Content-Type    <--->      @Consumes
Run Code Online (Sandbox Code Playgroud)

服务器使用它从正文中的客户端接收的内容(其格式在其中指定Content-Type)并且它产生客户端接受的内容(其格式在其中指定Accept).

示例:

  • 客户端发送以下标头:
    • Content-Type= text/xml(它在正文中发送XML)
    • Accept= application/json(它希望得到一个JSON作为响应)
  • 服务器需要至少具有相应方法的以下注释(如果未针对该方法明确提及注释,则从类级别获取注释):
    • @Consumes(MediaType.TEXT_XML) (它从客户端获取XML)
    • @Produces(MediaType.APPLICATION_JSON) (它向客户端发送JSON)

Obs:

  1. 服务器可以更灵活,配置为获得/生成多种可能的格式.

    例如:如果客户端具有以下注释,则客户端可以发送XML,而另一个客户端可以将JSON发送到同一方法:@Consumes({ MediaType.APPLICATION_JSON, MediaType.TEXT_XML }).

  2. MediaType值只是String常量:

    public final static String APPLICATION_JSON = "application/json";
    public final static String TEXT_XML = "text/xml";
    
    Run Code Online (Sandbox Code Playgroud)