REST API,什么时候使用@PathParam、@QueryParam、@RequestBody、and/or @RequestHeader

REST API, when to use @PathParam, @QueryParam, @RequestBody, and/or @RequestHeader

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

我一直在到处寻找,但每个 post 只谈论所列方法中的 2 个或 3 个之间的区别,而不是全部 4 个。

1. @PathParam

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

通常它是一个 HTTP 响应代码 404 如果你没有找到一个资源 id 作为 path param.

2。 @QueryParam

QueryParam 通常用于使用除 id 之外的任何其他字段来访问实体。考虑“搜索”或“过滤器”而不是使用“id”来访问实体。在这种情况下,您将不得不期待一个实体数组作为响应,这与您将获得的单个实体作为将 id 作为 pathParam

发送的响应不同

例如。 /employees?firstname=joe

注意:QueryParam也可以用于其他操作,例如sort。例如。 /departments/123/employees?sort_by=salary

如果您没有通过搜索参数或过滤器参数找到任何实体,通常它是一个带有空数组作为响应的 http 响应代码 200 body。

3。 @RequestBody

通常是 POST、PUT 或 PATCH http 动词,我们将用它来发送请求body。

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的情况

一个。状态突变

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

乙。 READ 操作(这些是 READ 不等同于 HTTP GET 的示例)

  • 一个。 为了避免Loooong Urls - 如果参数需要GET一个 entity 太长了,我们一般会用request body 来发送, 而不是使用 url。 Http协议或Rest原则不限 你的 url 大小,但是一些浏览器对最大长度有限制 url.

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

    b。 graphql - 在这里您将POST使用请求body进行查询 以您想要的格式获取数据

    c。 安全原因 - 如果您必须发送机密数据,例如 password/tokens 获取一些数据,通常你必须 post 它 在请求 body 或 headers 中。 (为什么?因为,如果它在 url 中, 它很有可能最终出现在应用程序日志中)

4. @RequestHeader

一般用于发送元数据;不是实际实体 body(数据)。例如。 request-correlation-id、authheader、安全令牌等

5. @Matrixparam、@CookieParam 等

还有其他 not-so 流行的 HTTP 动词,例如 @Matrixparam and @CookieParam are out there in the JAX-RS spec. This is the 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?