如何在Java Restful服务中使用JSON参数

16

我应该如何在我的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,以及如何解析它。

3个回答

18
我假设您正在谈论使用请求发送的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数据,我建议您查看问题“如何访问RESTful POST方法中的参数”,其中提供了一些非常棒的信息。


8
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();
        }

请点击此处参考相关内容。


1
我希望早点往下滚动并看到这个。我花了很多时间尝试调整标记答案以使其适用于我的POST请求。这个方法解决了问题。太棒了。 - MuffinTheMan

4

@PathParam用于将URL的一部分作为参数进行匹配。例如,在形如http:/example.com/books/{bookid}的URL中,您可以使用@PathParam("bookid")将书籍的ID传递给方法。

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

当请求URL包含有关参数的信息并且您可以直接在方法中使用数据时,都可以使用这两个注解。

如果此帖子无法帮助您,请详细说明问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接