如果在何时/何时不使用上述将信息传递给REST调用的方法,我一直试图找到答案。
我一直在寻找各地,但每个帖子只讨论两种列出的方法之间的区别,或3,而不是全部4。
答案 0 :(得分:6)
<强> 1。 @PathParam 强>
PathParam通常用于使用它的id访问实体。
例如。 /employees/{emp_id}
如果您没有通过它的id作为路径参数找到实体,那么它通常是HTTP响应代码404。
<强> 2。 @QueryParam 强>
QueryParam通常用于使用除id以外的任何其他字段来访问实体。想想“搜索”或“过滤”而不是使用“id”来到达实体。在这种情况下,您将不得不期望一组实体作为响应,而不像您将获得的单个实体作为发送id作为pathParam的响应
实施例。 /employees?firstname=joe
注意:QueryParam
也可用于其他操作,例如sort
。例如。 /departments/123/employees?sort_by=salary
如果您没有通过搜索参数或过滤器参数找到任何实体,那么通常它是一个http响应代码200,其中一个空数组作为响应主体。
第3。 @RequestBody 强>
通常它是一个POST,PUT或PATCH http动词,我们将通过它发送请求者。
Why it's a bad idea to send requestbody with http GET
Why it's a bad idea to send requestbody with http DELETE
州突变
要实现状态变异,通常json / xml表示实体所需的状态将以requestBody
的形式发送POST / PUT / PATCH动词。 Rest原则没有说json或xml,它可以是任何东西;它可以是压缩的二进制格式,如protobuf,avro,cap'n'proto等,甚至是纯文本。
READ操作(这些是READ不等同于HTTP GET的示例)
一个。 要避免Loooong网址 - 如果要获取GET所需的参数 实体太长了,我们通常会使用请求体来发送它, 而不是使用网址。 Http Protocol或Rest原则不限制 你在网址大小,但有些浏览器限制了最大长度 的网址。
What is the maximum length of a URL in different browsers?
湾 graphql - 在这里,您将使用requestbody发布查询 以所需格式获取数据
℃。 安全原因 - 如果您必须发送机密数据等 密码/令牌来获取一些数据,通常你必须发布它 在请求正文或标题中。 (为什么?因为,如果它在网址中, 很可能它最终会出现在应用程序日志中)
<强> 4。 @RequestHeader 强>
通常用于发送元数据;不是实际的实体(数据)。例如。 request-correlation-id,authheader等
<强> 5。 @Matrixparam,@ CookieParam等
在JAX-RS规范中还有其他不太流行的HTTP动词,如@Matrixparam和@CookieParam。这是Jersey documentation(请记住,Jersey是JAX-RS的参考实现。你可能会或者可能不会在Spring中找到相同/等效的东西)
When to use @QueryParam vs @PathParam
What is the difference between @PathParam and @QueryParam
HTTP POST with URL query parameters -- good idea or not?
How to POST JSON data with Curl from Terminal/Commandline to Test Spring REST?