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



我使用Jersey实现了一个REST服务,该服务获取JSON POST数据并从POJO模型创建一个对象。但是,为了使它起作用,我必须将内容类型设置为应用程序/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());
}

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

我在这里的回答中详细介绍了这个过程。

通了。我现在接受"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());
}

虽然,经过一番思考,考虑到它包含一个 JSON 请求正文,我可能应该需要 Content-Type 标头,但这完全是另一个讨论。

最新更新