JAX-RS:使用JSON POST数据而不将Content-Type标头设置为application / json

时间:2016-03-06 06:09:46

标签: java json rest jersey jax-rs

我使用Jersey实现了一个REST服务,该服务接收JSON POST数据并从POJO模型创建一个对象。但是,为了使其工作,我必须将Content-Type设置为application / json(即-H "Content-Type: application/json")。我喜欢的是能够使用JSON POST请求体,而无需用户设置标头,基本上就像Elasticsearch一样:

POST /test_index/_search?search_type=count
{
   "aggs": {
      "nested_authors": {
         "nested": {
            "path": "authors"
         },
         "aggs": {
            "author_last_names": {
               "terms": {
                  "field": "authors.last_name"
               }
            }
         }
      }
   }
} 

以下是相关代码:

@POST
@Path("/person")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response postPerson(PostBody pb) {
    System.out.println(pb.getEmails());
}

2 个答案:

答案 0 :(得分:1)

我遇到了类似的问题。因为在我看来,一个定义良好的API - 它不与任何其他系统共享其端点 - 不应该依赖于客户端指定正确的Content-Type,我创建了一个解决方法。在此变通方法中,我向那些资源方法添加了一个注释,我希望Jersey始终根据服务器定义的Content-Type尝试读取输入。每当存在此注释时,ResourceFilter将覆盖请求中的Content-Type标头,以及注释中指定的任何内容。

我在my answer here详细介绍了该过程。

答案 1 :(得分:0)

想出来。我现在正在接受" application / json"和" application / x-www-form-urlencoded"内容类型。这是代码:

@POST
@Path("/person")
@Consumes({MediaType.APPLICATION_JSON,MediaType.APPLICATION_FORM_URLENCODED})
@Produces(MediaType.APPLICATION_JSON)
public Response postPerson(String body) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    PostBody pb = mapper.readValue(body, PostBody.class);
    System.out.println(pb.getEmails());
}

虽然在考虑了一点后,我可能应该要求Content-Type标头,因为它包含一个JSON请求主体,但这完全是另一个讨论。