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

uni*_*rse 6 java api rest specifications get

那是我目前的REST GET方法.

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

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

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

带输入参数的POJO类:

class InputPojo {
    String input1;
    String input2;
    String input3;
    // Getters and Setters.
}
Run Code Online (Sandbox Code Playgroud)

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

fla*_*z14 4

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

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

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


通常,可以在 HTTP GET 方法中提供主体。那里讨论了这种方法:带有请求正文的 HTTP GET。一些知名产品,例如Elasticsearch ,提供了这样的查询:

GET /bank/_search
{
  "query": { "match_all": {} }
}
Run Code Online (Sandbox Code Playgroud)

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

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