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

问题描述 投票:6回答:2

那是我目前的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个参数添加为pathparams

@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对象作为输入参数?

java rest api get specifications
2个回答
4
投票

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

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

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


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

GET /bank/_search
{
  "query": { "match_all": {} }
}

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

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


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 = {“input1”:“XYZ”,“input2”:“ABC”,“input3”:“DEF”}。它对我有用。但是,如果Pojo健康,即变量太多,那么它不是一个好的做法,因为Uri太长了。

© www.soinside.com 2019 - 2024. All rights reserved.