如何发送和接收包含带泽西的JSON的PUT请求?

时间:2014-10-30 03:27:30

标签: java json jersey put

以下是我对服务器的说法:

@PUT
@Path("/put")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.TEXT_PLAIN })
public Response insertMessage(Message m) {
    return Response.ok(m.toString(), MediaType.TEXT_PLAIN).build();
}

对于客户:

ClientConfig config = new DefaultClientConfig();
config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
Client client = Client.create(config);
WebResource service = client.resource(getBaseURI());
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(new Message("a", "b", "message"));
ClientResponse response = service.path("put").accept(MediaType.APPLICATION_JSON)
                .type(MediaType.APPLICATION_JSON)
               .put(ClientResponse.class, json);
System.out.println(response.getStatus() + " " + response.getEntity(String.class));

对于消息:

public class Message {
    private String sender;
    private String receiver;
    private String content;
    @JsonCreator
    public Message() {}
    @JsonCreator
    public Message(@JsonProperty("sender") String sender,
            @JsonProperty("receiver")String receiver,
            @JsonProperty("content")String content) {
        this.sender = sender;
        this.receiver = receiver;
        this.content = content;
    }
}

我不断获得HTTP 406.我有

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>

在我的web.xml中。

2 个答案:

答案 0 :(得分:1)

您收到406错误,因为您的Jersey资源和您的客户端请求不匹配:Jersey正在生成文本响应,但您的客户端声明它只接受JSON。以下是W3C关于406错误的说法:

  

请求标识的资源只能生成响应实体,这些响应实体的内容特征根据请求中发送的接受标头不可接受。

您需要更改Jersey PUT方法以生成JSON ...

...
@Produces({ MediaType.APPLICATION_JSON })
public Response insertMessage(Message m) {
    return Response.ok(m.toString()).build();
}

或者在客户端请求中使用text/plain作为接受媒体类型:

service.accept(MediaType.TEXT_PLAIN);

查看您的修改,原始415错误是由客户端请求中缺少service.type(MediaType.APPLICATION_JSON)引起的。同样来自W3C,415错误是:

  

服务器拒绝为请求提供服务,因为请求的实体采用所请求方法所请求资源不支持的格式。

以下是我正在使用的W3C参考:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

答案 1 :(得分:0)

您获得的HTTP响应代码是

415 Unsupported Media Type

您是否尝试在WebResource上设置accept属性? 像这样:

service.accept(MediaType.APPLICATION_JSON);

看看这个topic。似乎是同样的问题。