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


96

何时在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

Answers:


123

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” 添加到标题中,并使用系统凭据来命中端点。接收系统会验证系统凭据已被授权代表用户执行操作,然后确认用户已被授权执行该操作。


感谢您提供如此全面的答案!您是否仍将X-User用于移动API,而使用邪恶代理(剥离标题)的风险仍然很高?
Vasile Cotovanu'2

1
不,我提到的X-User的用法是在系统到系统的连接中,其中系统代表第三方进行操作。例如,用户U与服务器A对话。服务器A向服务器B提供凭证,并带有X-User标头,说“使用我的凭证来检查我是否代表用户U被授权执行此操作”。这是在面向服务的体系结构中提出的,通常您使用的是HTTPS。移动平台几乎应始终由用户本人执行,并使用适当的第一人称凭证进行交易。
Nialscorva

7
第三段是我在SO上阅读的最有用的答案之一;-)
Alistair77

1
@Nialscorva很棒的解释!如果我希望用户通过授权的容器(例如我的移动应用)与我的API交互,该怎么办?我现在正在做的是,我的移动应用无权独自执行任何操作,并且最终用户也没有权限。如果用户愿意执行某项操作,则两个凭据都必须同时存在。
bolbol


5

只有在没有其他方法可以按标准或约定传递信息时,我才使用自定义标头。Darren102正在解释传递该值的典型方法。通过使用使用自定义标头的典型模式与Api,您的Api将会更加友好,这并不是说您将没有使用它们的情况,只是它们应该是最后的手段,而HTTP规范尚未处理过这些。


全心全意地同意...如果有完成任务的标准方法,切勿重新发明轮子。
亚历山德罗·桑蒂尼

5

何时在REST API的请求部分中使用... HTTP标头?

身份验证:GUID,基本身份验证,自定义令牌等,例如, 带有REST api的Guid令牌(而不是用户名/密码)的基本身份验证

如果您参与在PCI-DSS或其他安全规则所覆盖的域之间传递令牌或其他类似身份验证的信息,则您可能还必须埋入参数,因为某些法规明确要求身份验证元素不包含可能被重播的URL(来自浏览器历史记录,代理日志等)。


1

REST没有标准,但是可以接受的方式是

GET /orders/view/23

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


1

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

GET / orders / view / client / 23


1
我也不推荐自定义标头,但是代理损坏也不是原因。代理损坏了,应该修复。
朱利安·雷施克

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

REST风格的POST响应应为HTTP 303,并将Location标头设置为“ / orders / view / 23”。
Rich Remer

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.