REST API: 自定义 HTTP 头与 URL 参数

什么时候在 REST API 的请求部分中使用自定义 HTTP 头?

例如:

你有没有用过

GET /orders/view
(custom HTTP header) CLIENT_ID: 23

instead of

GET /orders/view/client_id/23 or
GET /orders/view/?client_id=23
116484 次浏览

无论接受的方式是什么,REST 都没有标准

GET /orders/view/23

不使用自定义标头,因此23 after 视图假定为 id,因此您将有一个接受 id 的函数,因此只产生该信息。

我不会使用自定义标头,因为您不知道是否有代理会传递这些标头。基于 URL 是一种方法。

GET/orders/view/client/23

Definitely OK:

GET /orders/view/client_id/23 or
GET /orders/view/?client_id=23

也可以:

GET /orders/view/23 or

我也会认为这样做没问题:

POST /orders/view
(custom HTTP header) CLIENT_ID: 23

I would only use a custom header when there is no other way to pass information by standard or convention. Darren102 is explaining the typical way to pass that value. Your Api will be much more friendly by using typical patterns verse using custom headers.That's not to say you won't have a case to use them, just that they should be the last resort and something not already handled by the HTTP spec.

The URL indicates the resource itself. A "client" is a resource that can be acted upon, so should be part of the base url: /orders/view/client/23.

参数就是参数化对资源的访问。这尤其适用于文章和搜索: /orders/find?q=blahblah&sort=foo。参数和子资源之间有一条细微的界限: /orders/view/client/23/active versus /orders/view/client/23?show=active。我建议使用子资源样式和保留参数进行搜索。

由于每个端点代表一个状态传输(以破坏助记符) ,自定义头应该只用于不涉及资源名称(URL)、资源状态(主体)或直接影响资源的参数(参数)的事情。这样就留下了关于自定义头请求的真正元数据。

HTTP 有非常广泛的头部选择,涵盖了您需要的大部分内容。我所看到的自定义头出现在代表用户进行操作的系统到系统请求中。代理系统将验证用户,并将“ X-User: userid”添加到消息头,并使用系统凭据命中端点。接收系统验证系统凭据是否被授权代表用户执行操作,然后验证用户是否被授权执行操作。

什么时候在 REST API 的请求部分中使用... HTTP 头?

身份验证: GUID、基本身份验证、自定义令牌等, 使用 REST api 的 Guid 令牌代替 username/password 的基本身份验证

如果你涉及到在 PCI-DSS 或其他安全规则覆盖的域之间传递令牌或其他类似身份验证的信息,你也可能不得不隐藏参数,因为一些规则明确要求身份验证元素远离可以被轻易重播的 URL (来自浏览器历史记录、代理日志等)。

自定义标头具有以下优点:

  • 保持 url 不受安全问题的影响(更安全,而不是在浏览器/代理缓存中)

就个人而言,我只会在我自己的网络代码和我自己的网络服务器之间的内部使用,以防我需要一些特殊的东西。

考虑到 包裹中不是一个好的实践,您可以使用自定义头来包含有关部分处理的请求的更多信息。标题是 安全

使用 HTTP 头发送,

  • 指令(以 JSON 格式读取输入)

  • 元数据(发出请求的人)

  • 在每个请求上发送的公共数据(如身份验证, session )

使用 路径参数制作,

  • 对资源(/country/state/city)的特定请求

    它们必须形成一个逻辑层次结构

使用 查询参数发送,

  • Action requests on a resource ( like pagination, filters )