在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 与 /orders/view/client/23?show=active
。我建议使用子资源风格,并将参数保留用于搜索。
由于每个端点都代表着一次状态转移(为了搞乱助记符),因此自定义标头只应用于不涉及资源名称(url)、资源状态(正文)或直接影响资源的参数(参数)的事物。这样留下真正的元数据请求来使用自定义标头。
HTTP有非常广泛的标头选择,涵盖了大多数你需要的东西。我见过自定义标头出现在系统对用户进行操作的请求中。代理系统将验证用户并向标头添加"X-User: userid
",然后使用系统凭据击中端点。接收系统验证系统凭据是否有权代表用户进行操作,然后验证用户是否有权执行该操作。
使用 HTTP Headers 发送:
指令 ( 以 JSON 格式读取输入 )
元数据 ( 请求发出者是谁 )
每个请求都需要发送的共同数据 ( 如身份验证、会话 )
使用 Path Parameters 来进行:
特定资源的请求 ( /country/state/city )
它们必须形成逻辑层级结构
使用 Query Parameters 发送:
只有在没有标准或约定的情况下,我才会使用自定义头来传递信息。Darren102正在解释传递该值的典型方式。通过使用典型模式而不是使用自定义头,您的Api将更加友好。这并不是说您不会使用它们,只是它们应该是最后的选择,并且不应该已经由HTTP规范处理。
自定义标头具有以下优点:
个人而言,我只会在自己的web代码和自己的web服务器之间内部使用它们,以防需要特殊处理。
REST 没有标准,但被广泛接受的方式是:
GET /orders/view/23
没有使用自定义标头,因此视图后面的23被假定为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