【问题标题】:How to consume json parameter in java restful servicejava restful服务中如何使用json参数
【发布时间】:2015-05-13 00:45:53
【问题描述】:

如何在我的 web 服务中使用 json 参数,我可以使用 @PathParam 获取参数,但获取 json 数据作为参数不知道该怎么做。

@GET
@Path("/GetHrMsg/json_data")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces(MediaType.APPLICATION_JSON)
public String gethrmessage(@PathParam("emp_id") String empid) {

}

用什么代替@PathParam 以及以后如何解析它。

【问题讨论】:

    标签: java json web-services


    【解决方案1】:

    我假设您正在谈论使用随请求发送的 JSON 消息正文。

    如果是这样,请注意虽然没有完全禁止,但普遍认为 GET 请求应该有请求正文。请参阅“HTTP GET with request body”问题了解原因。

    我提到这一点只是因为您的示例显示了一个 GET 请求。如果您正在执行 POST 或 PUT,请继续阅读,但如果您确实在项目中执行 GET 请求,我建议您改为关注kondu's solution


    话虽如此,要使用 JSON 或 XML 消息正文,请包含一个(未注释的)方法参数,该参数本身就是一个表示消息的 JAXB bean。

    所以,如果您的邮件正文如下所示:

    {"hello":"world","foo":"bar","count":123}
    

    然后你将创建一个对应的类,如下所示:

    @XmlRootElement
    public class RequestBody {
        @XmlElement String hello;
        @XmlElement String foo;
        @XmlElement Integer count;
    }
    

    您的服务方法如下所示:

    @POST
    @Path("/GetHrMsg/json_data")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public void gethrmessage(RequestBody requestBody) {
        System.out.println(requestBody.hello);
        System.out.println(requestBody.foo);
        System.out.println(requestBody.count);
    }
    

    哪个会输出:

    world
    bar
    123
    

    有关使用 JAXB 使用不同类型的 HTTP 数据的更多信息,我建议您查看问题“How to access parameters in a RESTful POST method”,其中包含一些很棒的信息。

    【讨论】:

      【解决方案2】:

      Bertag 关于 GET 的评论是正确的。但是如果你想做消费json数据的POST请求,那么你可以参考下面的代码:

              @POST
              @Path("/GetHrMsg/json_data")
              @Consumes(MediaType.APPLICATION_JSON)
              public Response gethrmessage(InputStream incomingData) {
                  StringBuilder crunchifyBuilder = new StringBuilder();
                  try {
                      BufferedReader in = new BufferedReader(new InputStreamReader(incomingData));
                      String line = null;
                      while ((line = in.readLine()) != null) {
                          crunchifyBuilder.append(line);
                      }
                  } catch (Exception e) {
                      System.out.println("Error Parsing: - ");
                  }
                  System.out.println("Data Received: " + crunchifyBuilder.toString());
      
                  // return HTTP response 200 in case of success
                  return Response.status(200).entity(crunchifyBuilder.toString()).build();
              }
      

      参考请click here

      【讨论】:

      • 我希望我能向下滚动并早点看到这个。我花了很多时间尝试调整标记的答案以适用于我的 POST 请求。这成功了。漂亮。
      【解决方案3】:

      @PathParam用于匹配URL的一部分作为参数。例如在http:/example.com/books/{bookid} 形式的url 中,您可以使用@PathParam("bookid") 将一本书的ID 获取到一个方法。

      @QueryParam 用于访问 URL 查询字符串中的键/值对(? 后面的部分)。例如在urlhttp:/example.com?bookid=1中,可以使用@QueryParam("bookid")获取`bookid的值。

      当请求 url 包含有关参数的一些信息并且您可以直接在方法中使用数据时,会使用这两种方法。

      如果本文对您没有帮助,请详细说明问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-04
        • 2016-06-23
        • 2015-06-03
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多