【问题标题】:REST API, when to use @PathParam, @QueryParam, @RequestBody, and/or @RequestHeaderREST API,何时使用@PathParam、@QueryParam、@RequestBody 和/或@RequestHeader
【发布时间】:2018-06-29 00:04:25
【问题描述】:

如果关于何时/何时不使用上述将信息传递给 REST 调用的方法有某种标准,我一直在尝试寻找答案。

我一直在到处寻找,但每篇文章都只讨论列出的 2 种方法之间的区别,或者说 3 种,而不是全部 4 种。

【问题讨论】:

  • 在担心这些注释之前,您必须了解 REST API 通常是如何工作的。这就是 URL 路径和查询参数以及发送 POST/PUT 正文与 GET 方法之间的区别。注释只允许您在 Spring 控制器中获取已映射到 POJO 的值。
  • @tsolakp 我了解 POST、PUT、GET、HEAD、DELETE 等方法之间的区别。我了解 REST API 的工作原理以及上述注释。我要问的是向 REST API 调用发送数据的“标准”是什么。例如,如果我要发送一个参数,我应该怎么做?为什么以及为什么我不应该把它放在标题中?比如,X : 0, Y : 2 等等。为什么我不应该/不应该像 { "x" : 0, "y" : 2 } 这样在请求正文中将它作为 JSON 对象发送?为什么我应该/不应该让它成为路径的一部分,例如 /rest/path/x/0/y/2 (显然很糟糕,但只是示例)或 /rest/path/?x=0&y=2
  • 这就是我的观点。这些问题与注释无关,更多的是针对 REST 最佳实践。
  • 我的问题不是这么说的吗?仅仅因为我有一个@infront(我理解这意味着它是一个注释)并不一定意味着我在询问注释。事实上,如果你阅读完整的问题,我从来没有问过注释本身,只是在哪里最好使用它们,即 REST 最佳实践。

标签: java spring rest spring-boot restful-architecture


【解决方案1】:

1. @PathParam

PathParam 通常用于使用id 获取资源。 例如。 /employees/{emp_id}

如果您没有通过 idpath param 找到资源,通常是 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

以下是我们使用RequestBody的情况

A.状态突变

为了实现状态突变,通常实体所需状态的 json/xml 表示将作为requestBody 与 POST/PUT/PATCH 动词一起发送。 Rest 原则并没有说任何关于 json 或 xml 的内容,它可以是任何东西;它可以是压缩的二进制格式,例如 protobuf、avro、cap'n'proto、flatbuffers 等,甚至是纯文本。

B. READ 操作(这些是 READ 不等同于 HTTP GET 的示例

  • 一个。 为了避免 Loooong Urls - 如果 GET 所需的参数 实体太长了,我们通常会使用请求体来发送它, 而不是使用网址。 Http 协议或 Rest 原则不限制 您在 url 大小上,但是某些浏览器对最大长度有限制 的网址。

    What is the maximum length of a URL in different browsers?

    b. graphql - 在这里您将使用 requestbody 发布查询 以您想要的格式获取数据

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

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 do I POST JSON data with cURL?

【讨论】:

  • 为了完整起见,您可能还想将@MatrixParam 添加到列表中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 2016-06-27
相关资源
最近更新 更多