那是我目前的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对象作为输入参数?
根据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不支持它的原因。
@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太长了。