REST API - GET方法,输入参数为主体中的JAVA对象

时间:2017-08-21 14:41:56

标签: java rest api get specifications

这是我当前的REST GET方法。

@GET
@Path("/URI/{input1}")
@Produces(MediaType.APPLICATION_JSON)
public List<T> getDetails(@PathParam("input1") String input1) throws ServiceException;

现在我想再添加3个输入参数。我可以创建一个包含所有4个输入参数的POJO对象,并将该POJO传递给GET方法,而不是将所有4个参数添加为路径参数

@GET
@Path("/URI")
@Produces(MediaType.APPLICATION_JSON)
public List<T> getDetails(InputPojo input) throws ServiceException;

带输入参数的POJO类:

class InputPojo {
    String input1;
    String input2;
    String input3;
    // Getters and Setters.
}

或者这是针对REST GET规范的,我不能使用Java POJO对象作为输入参数吗?

2 个答案:

答案 0 :(得分:4)

根据HTTP协议规范, GET 方法不能提供正文。例如。您只能将数据作为URI的一部分传递。

实际上,您可以通过GET方法提供对象。只需将其转换为文本(如JSON),将其编码为 base64 (因为URI中不允许使用空格等符号),将该内容放入input1路径变量(例如{{1 }})。然后在服务器上解码/URI/encodedpojohere字符串并将其转换回Java的POJO。

这种方法有一些限制(最明显的是URI字符串的长度有限 - 约为65535个符号)。效率低下(你不能传输任意字节序列,需要对它们进行编码)。也许,这就是为什么没有任何标准的转换器/注释/帮助类通过GET请求传输POJO。因此,请改用 POST PUT 方法。 Spring和其他框架有很多实用程序类/注释。

通常,可以在HTTP GET方法中提供正文。在那里讨论了这种方法:HTTP GET with request body。一些知名产品,例如Elasticsearch提供如下查询:

input1

(相应的HTTP请求可以通过 curl 命令行实用程序执行)

无论如何,身体的HTTP GET是非标准的。也许,这就是为什么Java不支持它。

答案 1 :(得分:0)

@Path("/injectdemo")

公共类TestClass {

//URI: http:URI/injectdemo/create?queryparam={"input1" : "XYZ", "input2" : "ABC", "input3" : "DEF"}
@GET
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/create")
public InputPojo postMsg(@QueryParam("queryparam") String jsonString) throws JsonParseException, JsonMappingException, IOException {

    //Method 1: Convert Json String to required pojo
    InputPojo inputPojo = new ObjectMapper().readValue(jsonString, InputPojo.class);

    //Method 2: Convert Json String to required pojo
    InputPojo inputPojo1 =new Gson().fromJson(jsonString, InputPojo.class);


    return inputPojo;
}

}

  

JSON字符串可以在URI中发送为:http:URI / injectdemo / create?queryparam = {&#34; input1&#34; :&#34; XYZ&#34;,&#34;输入2&#34; :&#34; ABC&#34;,&#34;输入3&#34; :&#34; DEF&#34;}。它对我有用。但是,如果Pojo健康,即变量太多,那么它不是一个好的做法,因为Uri太长了。