Java REST API,何时使用@PathParam、@QueryParam、@RequestBody和/或@RequestHeader

Java REST API,何时使用@PathParam、@QueryParam、@RequestBody和/或@RequestHeader,java,spring,rest,spring-boot,restful-architecture,Java,Spring,Rest,Spring Boot,Restful Architecture,我一直试图找到一个答案,关于何时/何时不使用上述向REST调用传递信息的方法是否有某种标准 我一直在到处寻找,但每篇帖子都只讨论列出的方法中的两种,或三种,而不是全部四种方法之间的区别。1@路径参数 PathParam通常用于使用资源的id访问资源。 例如,/employees/{emp_id} 如果您没有通过idaspath param找到资源,则通常是HTTP响应代码404 2@查询参数 QueryParam通常用于使用id以外的任何其他字段访问实体。请考虑使用“搜索”或“筛选”而不是使用“

我一直试图找到一个答案,关于何时/何时不使用上述向REST调用传递信息的方法是否有某种标准


我一直在到处寻找,但每篇帖子都只讨论列出的方法中的两种,或三种,而不是全部四种方法之间的区别。

1@路径参数

PathParam通常用于使用资源的
id
访问资源。 例如,
/employees/{emp_id}

如果您没有通过
id
as
path param
找到资源,则通常是HTTP响应代码404

2@查询参数

QueryParam
通常用于使用id以外的任何其他字段访问实体。请考虑使用“搜索”或“筛选”而不是使用“id”访问实体。在这种情况下,您将需要一个实体数组作为响应,而不是作为发送
id
as
pathParam

例如
/employees?firstname=joe

注意:
QueryParam
也可用于其他操作,如
排序
。例如,
/departments/123/employees?排序依据=工资

如果您没有通过搜索参数或筛选参数找到任何实体,则通常是http响应代码200,响应主体为空数组

3@请求主体

通常它是一个POST、PUT或PATCH http动词,我们将使用它发送requestbody

以下是我们使用RequestBody的情况

A.状态突变

为了实现状态变异,通常实体所需状态的json/xml表示将通过POST/PUT/PATCH动词作为
requestBody
发送。Rest原则没有提到json或xml,它可以是任何东西;它可以是压缩的二进制格式,如protobuf、avro、cap'n'proto、flatbuffer等,甚至也可以是纯文本

B.读取操作(这些示例中,读取并不等同于HTTP GET

  • a避免长URL-如果获取 实体太长了,我们通常会使用请求体发送它, 而不是使用url。Http协议或Rest原则不限制 您可以选择url大小,但是有些浏览器对最大长度有限制 url的名称

    bgraphql-这里您将使用requestbody发布查询 以所需格式获取数据

    c安全原因-如果您必须发送机密数据,如 获取某些数据的密码/令牌,通常必须将其发布 在请求正文或标题中。(为什么?因为,如果它在url中, 它很有可能最终出现在应用程序日志中)

4@RequestHeader

一般用于发送元数据;不是实际的实体体(数据)。例如,请求相关id、authheader、安全令牌等

5@Matrixparam、@CookieParam等

JAX-RS规范中还有其他不太流行的HTTP动词,如和@CookieParam。这就是(请记住,Jersey是JAX-RS的参考实现。在Spring中可能找不到等效的东西)

其他有趣的相关阅读


在担心这些注释之前,您必须了解RESTAPI的一般工作原理。这就是URL路径和查询参数以及发送POST/PUT body和GET方法之间的区别。注释只允许您获取那些已经映射到Spring控制器中POJO的值。@tsolakp我理解POST、PUT、get、HEAD、DELETE等方法之间的区别。我了解RESTAPI的工作原理,以及上面的注释。我要问的是,向RESTAPI调用发送数据的“标准”是什么。例如,如果我正在发送一个参数,我应该如何发送?为什么,为什么我不应该把它放在头上?比如,X:0,Y:2等等。为什么我不应该把它作为请求体中的JSON对象发送,比如{“X”:0,“Y”:2}?为什么我不应该把它作为路径的一部分,比如/rest/path/x/0/y/2(显然很糟糕,但只是一个例子)或/rest/path/?x=0&y=2这就是我的观点。这些问题与注释无关,它们更倾向于REST最佳实践。这不是我的问题所说的吗?仅仅因为我有一个@infort(我理解这意味着它是一个注释),并不一定意味着我在询问注释。事实上,如果您阅读了完整的问题,我从来没有问过注释本身,只问在哪里最好使用它们,即REST最佳实践。为了完整性,您可能还想将
@MatrixParam
添加到列表中