何时在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
答案 0 :(得分:100)
URL表示资源本身。 “客户”是可以采取行动的资源,因此应该是基本网址的一部分:/orders/view/client/23
。
参数只是参数化对资源的访问。这尤其适用于帖子和搜索:/orders/find?q=blahblah&sort=foo
。参数和子资源之间有一条细线:/orders/view/client/23/active versus /orders/view/client/23?show=active
。我推荐用于搜索的子资源样式和保留参数。
由于每个端点都呈现状态转移(以破坏助记符),因此自定义标头只应用于不涉及资源名称(网址),资源状态(正文),或直接影响资源的参数(参数)。这留下了关于自定义标头请求的真实元数据。
HTTP提供了非常广泛的标题选择,涵盖了您需要的大部分内容。我看到自定义标题出现在系统到系统请求代表用户操作。代理系统将验证用户并向标头添加“X-User: userid
”并使用系统凭据命中端点。接收系统验证系统凭据是否有权代表用户执行操作,然后验证用户是否有权执行操作。
答案 1 :(得分:5)
当没有其他方法按标准或惯例传递信息时,我只会使用自定义标头。 Darren102解释了传递该值的典型方法。通过使用自定义标题的典型模式,你的Api会更加友好。这并不是说你不会有使用它们的情况,只是它们应该是最后的手段,而且还没有HTTP规范处理的东西。 / p>
答案 2 :(得分:5)
自定义标题具有以下优点:
答案 3 :(得分:4)
何时在REST API的请求部分中使用... HTTP标头?
身份验证:GUID,基本身份验证,自定义令牌等,例如, Basic Authentication with a Guid token for REST api instead of username/password
如果您涉及在PCI-DSS或其他安全规则所涵盖的域之间传递令牌或其他类似身份验证的信息,您可能还必须隐藏参数,因为某些法规明确要求身份验证元素不在URL之内重播(来自浏览器历史记录,代理日志等)。
答案 4 :(得分:1)
REST没有标准,但接受的方式是
GET /orders/view/23
不使用自定义标题,因此视图之后的23假定为id,因此您将拥有一个接收id的函数,因此只生成该信息。
答案 5 :(得分:1)
我不会使用自定义标头,因为您不知道任何代理是否会传递这些标头。基于URL是最佳选择。
GET / orders / view / client / 23
答案 6 :(得分:1)
绝对可以:
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
答案 7 :(得分:0)
考虑到Enveloping不是一个好习惯,您可以使用自定义标头来包含有关部分处理的请求的更多信息。标头为secure。