【问题标题】:API requires POST arguments in a query string?API 需要查询字符串中的 POST 参数?
【发布时间】:2012-05-02 01:32:19
【问题描述】:

我正在使用 Twitter API 并注意到一些有趣的事情 - 对于更新,它们需要 POST 方法,但需要查询字符串中的参数。 (例如,请参阅他们的开发者控制台 here 中的状态/更新调用。)

显然这在技术上是可行的,但为什么会有人这样做呢? POST 参数不属于正文吗?

【问题讨论】:

    标签: http rest twitter http-post


    【解决方案1】:

    任何一个选项都同样有效。我最喜欢在 POST 的 URL 中使用参数的示例是在地图上设置航点的应用程序。例如

         POST /map/route/45/waypoints?lat=35&long=74
    

    在这种情况下,参数在 URI 中作为位置标识符更有意义,而不仅仅是在正文中传递给通用资源的参数。

    【讨论】:

    • 似乎与语义不符。如果我在请求的处理端,我的 POST VARS 将从正文中解析,始终从 URL 获取 VARS。
    • @Yarin 我了解,但您将 HTML 概念应用于 HTTP,而 HTTP 中不存在这些概念。 URI 是标识符,正文是有效负载。从 HTTP GET 和 POST 的角度来看,URI 是相同的。
    • 这与 HTML 无关,它是响应的一部分。这是一个 HTTP 请求问题,我见过的每个 POST 定义“数据都包含在请求的正文中”wiki,尽管搜索specs 我还没有找到一个硬性规则这个。
    • @Yarin 几年前,我在 HTTP 工作组邮件列表中发布了一个相关问题,我得到的回复是,带有空正文的 POST 是完全有效的。 lists.w3.org/Archives/Public/ietf-http-wg/2010JulSep/0272.html
    • @Yarin 问题在于 Nathan 通过引入使用 GET 来执行不安全操作来混淆问题,并推断这与 URI 中参数的存在之间存在某种关系。 Uris 只是标识符,服务器可以选择将其中的一部分解释为服务器端进程的参数,无论使用何种方法,该概念都是有效的。这就是为什么 URI 模板规范没有提到 HTTP 方法的原因。不过,我确实听到了您的担忧,我只是认为没有发生任何违反规范的情况。
    【解决方案2】:

    在 REST 架构中,GET 和 POST 只是动词,它们指示检索或创建/更新资源。 URI 定义了资源的标识。

    例子:

    POST /student?name=Tom&age=12 >> It will create a new student with name Tom and age 12.
    POST /student/10?name=Tom&age=12 >> It will update student with id 20 with name Tom and age 12.
    

    没有规定数据应绑定到正文负载或 URI。这与在 POST 中发送 HTML 表单数据的 WEB 1.0 概念不同。

    【讨论】:

    • OK 有趣-我想知道是否在 REST 架构中 POST 参数 belong 在 URL 中..
    • 不,不是那样的。正如我所说,如果它们很少,您可以在 URL 中发送它们,如果它们很多,则可以将它们作为 json、xml 或其他媒体类型发送到有效负载中。这取决于开发人员以及他希望 api 调用更简单、更有意义的程度。
    • 如果您要进行更新,应该使用PUT 而不是POST
    【解决方案3】:

    WEB API 的参数是否在正文或查询中取决于您在 POST 中发送的 Content-Type 标头。

    如果是Content-Type: application/json; charset=UTF-8 则参数在正文中应为 json。如果是Content-Type:application/x-www-form-urlencoded; charset=UTF-8 那么参数应该在查询字符串中

    【讨论】:

    • 我认为这不准确。如果 Content-Type 是 application/x-ww-form-urlencoded,大多数 API(根据我的经验)期望参数是在请求实体中编码的表单 url,而不是在查询字符串中。无论哪种方式(application/json 或 application/x-www-urlencoded),除了请求实体之外,一些 API 还接受查询字符串。
    猜你喜欢
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2020-09-01
    相关资源
    最近更新 更多