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

2022-09-03 05:13:17

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


答案 1

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

如果是这样,请注意,虽然没有完全禁止,但普遍的共识是GET请求不应该有请求正文。请参阅“带有请求正文的 HTTP GET”问题,了解原因。

我之所以提到这一点,只是因为您的示例显示了一个 GET 请求。如果您正在执行POST或PUT,请继续阅读,但是如果您确实在项目中执行GET请求,我建议您遵循kondu的解决方案


话虽如此,要使用 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方法中访问参数”,其中包含一些很棒的信息。


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

如需参考,请点击这里