【问题标题】:Should I use GET or POST if getting idempotent information but with parameters that are not meant to be in URL如果获取幂等信息但使用不应该在 URL 中的参数,我应该使用 GET 还是 POST
【发布时间】:2020-09-30 09:53:55
【问题描述】:

当您提供参考 ID 时,我有一个获取信用卡号的 API。参考 id 被认为是敏感数据,所以我的理解是它不应该出现在 URL 中,而是需要在 JSON 正文中定义,而协议是用于加密的 HTTPs。

现在该请求应该是一个 GET,它在阅读时听起来更自然,但在将 JSON 正文附加到它时看起来很奇怪。或者它应该是 POST,如果有一个 JSON 主体是有意义的,但在阅读它时听起来很奇怪,而且请求本身幂等的。

【问题讨论】:

  • 如果您提供 reference id 作为参数来获得结果,那么您/应该使用 POST 请求。 post 方法应该处理输入、查询数据库并返回响应。为此,您应该使用 html 表单。
  • 嗨@Ghassan。正如 Mohamoud 所建议的那样,POST 是到达这里的方式,尽管这不一定是一种形式。如果您愿意,可以直接发送 JSON - 这是一个示例:reqbin.com/req/javascript/4rwevrqh/post-json-example。如果您使用的是表单,请务必添加 CSRF 保护(请参阅此处:owasp.org/www-community/attacks/csrf)。无论哪种情况,请务必使用 https!

标签: api rest http


【解决方案1】:

GET 请求消息中的负载没有定义的语义 -- RFC 7231

如果您必须在请求的负载中将信息传递给服务器,那么 GET 不是一个有效的选项。

另一方面

POST 在 HTTP 中有许多有用的用途,包括“此操作不值得标准化”的一般用途。 -- Fielding, 2009

换句话说,如果其他registered methods 都没有适当的语义并且我们不想extend HTTP 使用我们自己的方法令牌,我们将使用 POST。

如果有一个 JSON 主体是有意义的,但在阅读它时听起来很奇怪,并且请求本身是幂等的,它应该是 POST。

这并不理想 - 您有一个预期语义是幂等的请求,但没有有效的方式将其传达给通用组件。


您有时可以做的是使用带有正文的请求来创建新资源,然后使用带有新资源标识符的 GET。这样可以将敏感信息排除在日志之外,同时仍为您提供安全的语义,但代价是额外的往返行程和一些复杂性

POST /foo
Content-Type: application/json

{ "CreditCardNumber" : "0000-0000-0000-0000" }


201 Created
Location: /4d49cad6-4165-472d-ad61-c91160fdd06c
Content-Location: /4d49cad6-4165-472d-ad61-c91160fdd06c

这里,Location 告诉通用客户端新页面的创建位置,Content-Location 告诉通用客户端此消息的内容是新页面的副本。

如果客户端想稍后检查该页面是否有更新,则可以使用简单的 GET 请求

GET /4d49cad6-4165-472d-ad61-c91160fdd06c

所以 URI 从来没有信用卡号,而是有一个令牌,可以从服务器上的某个安全存储中解锁信用卡号。

实际上,/4d49cad6-4165-472d-ad61-c91160fdd06c 是一个网页关于信用卡号0000-0000-0000-0000

但是当客户端不记得该网页的唯一标识符并且必须使用 POST 再次询问它在哪里时,会有额外的歌舞。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    相关资源
    最近更新 更多