Java REST API,何时使用@PathParam、@QueryParam、@RequestBody和/或@RequestHeader
我一直试图找到一个答案,关于何时/何时不使用上述向REST调用传递信息的方法是否有某种标准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以外的任何其他字段访问实体。请考虑使用“搜索”或“筛选”而不是使用“
我一直在到处寻找,但每篇帖子都只讨论列出的方法中的两种,或三种,而不是全部四种方法之间的区别。1@路径参数 PathParam通常用于使用资源的
id
访问资源。
例如,/employees/{emp_id}
如果您没有通过id
aspath param
找到资源,则通常是HTTP响应代码404
2@查询参数
QueryParam
通常用于使用id以外的任何其他字段访问实体。请考虑使用“搜索”或“筛选”而不是使用“id”访问实体。在这种情况下,您将需要一个实体数组作为响应,而不是作为发送id
aspathParam
例如/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中, 它很有可能最终出现在应用程序日志中)
在担心这些注释之前,您必须了解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
添加到列表中