【发布时间】:2012-02-28 10:58:41
【问题描述】:
您何时在 REST API 的请求部分使用自定义 HTTP 标头?
例子:
你会用吗
GET /orders/view
(custom HTTP header) CLIENT_ID: 23
而不是
GET /orders/view/client_id/23 or
GET /orders/view/?client_id=23
【问题讨论】:
您何时在 REST API 的请求部分使用自定义 HTTP 标头?
例子:
你会用吗
GET /orders/view
(custom HTTP header) CLIENT_ID: 23
而不是
GET /orders/view/client_id/23 or
GET /orders/view/?client_id=23
【问题讨论】:
URL 表示资源本身。 “客户端”是可以操作的资源,因此应该是基本 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”添加到标头中,并使用系统凭据访问端点。接收系统验证系统凭据是否有权代表用户执行操作,然后验证用户是否有权执行该操作。
【讨论】:
只有在没有其他方法通过标准或约定传递信息时,我才会使用自定义标题。 Darren102 正在解释传递该值的典型方法。通过使用使用自定义标头的典型模式,您的 Api 将更加友好。这并不是说您没有使用它们的案例,只是它们应该是最后的手段,并且 HTTP 规范尚未处理。
【讨论】:
您什么时候在 REST API 的请求部分使用...HTTP 标头?
身份验证:GUID、基本身份验证、自定义令牌等,例如, Basic Authentication with a Guid token for REST api instead of username/password
如果您参与在 PCI-DSS 或其他安全规则涵盖的域之间传递令牌或其他类似身份验证的信息,您可能还必须隐藏参数,因为某些法规明确要求身份验证元素远离可能微不足道的 URL重播(来自浏览器历史记录、代理日志等)。
【讨论】:
自定义标头具有以下优点:
就我个人而言,我只会在我自己的网络代码和我自己的网络服务器之间使用它们,以防我需要一些特殊的东西。
【讨论】:
使用 HTTP 标头 进行发送,
指令(以 JSON 格式读取输入)
元数据(提出请求的人)
在每个请求上发送的公共数据(例如身份验证, 会话)
使用路径参数制作,
对资源的特定请求 ( /country/state/city )
它们必须形成一个逻辑层次结构
使用查询参数进行发送,
【讨论】:
REST 没有标准,但可接受的方式是
GET /orders/view/23
不使用自定义标题,因此 23 after view 假定为 id,因此您将拥有一个接收 id 并因此仅生成该信息的函数。
【讨论】:
我不会使用自定义标头,因为您不知道是否有任何代理会传递这些标头。基于 URL 是要走的路。
GET /orders/view/client/23
【讨论】:
没问题:
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
【讨论】:
考虑到Enveloping 不是一个好的做法,您可以使用自定义标头来包含有关部分处理的请求的更多信息。标题是secure。
【讨论】: