如何在java restful服务中使用json参数

时间:2015-03-11 09:42:39

标签: java json web-services

如何在我的webservice中使用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 个答案:

答案 0 :(得分:15)

我假设您正在讨论使用随请求发送的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",它有一些很棒的信息。

答案 1 :(得分:5)

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

答案 2 :(得分:4)

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

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

当请求网址包含有关参数的一些信息时,可以使用这些参数,您可以直接在方法中使用数据。

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