【问题标题】:REST request cannot be encoded for GET (URL too long)REST 请求无法为 GET 编码(URL 太长)
【发布时间】:2013-11-15 06:24:26
【问题描述】:

例子:

问题:搜索词可能太长,以至于超出了网络服务器的最大值 网址长度。

我如何允许极长的搜索字词仍然保持 RESTful?

【问题讨论】:

    标签: api rest search http-headers x-http-method-override


    【解决方案1】:

    为了灵感,我只看了Google Translate's API v2,这是“使用 RESTful 调用风格。”

    当然,要翻译的文本可能会很长。所以谷歌可选 允许使用POST 发送请求,但有一点不同:

    要使用POST,您必须使用X-HTTP-Method-Override 标头告诉 翻译 API 以将请求视为 GET(使用 X-HTTP-Method-Override: GET)。

    因此可以在语义上POST 请求转换为GET 请求。

    (这个发现让我在我的问题中添加了 标签。)

    【讨论】:

    • 嘿feklee。我检查了您发布的链接,但找不到它使用 X-HTTP-Method-Override。在 v2 中,Google 似乎避免使用此标头。我实际上认为使用标题是 hacky。此标头的主要用例是用于不支持 DELETE/PUT 等的旧浏览器。如果你已经需要一个 POST 来处理一个大的输入内容,为什么还需要这个 header?
    【解决方案2】:

    REST 不将 POST 限制为创建。小心将 CRUD 映射到 HTTP 方法并假设它是 RESTful。 POST 是用于任何未由 HTTP 标准化的操作的方法。

    由于标准没有对 URI 建立限制,这可以被认为是一个错误的实现,可以修复它。只要解决方法与您的 API 松散耦合,您仍然是 RESTful。这意味着您的 API 不应该直接实现翻译或覆盖,而是在某种类型的预处理器上正确地重写请求。应该在某处清楚地记录这是由于实施中断造成的,并且您希望它最终会过时。

    【讨论】:

    • 感谢您的想法,尤其是关于 REST 与 CRUD 的想法。像 Google does it 一样指定 X-HTTP-Method-Override: GET 看起来是定义异常(解决方法)并记录它的好方法。
    • 没关系,只要该行为不是由资源实现本身实现的。
    【解决方案3】:

    如果您的查询过长以至于超过最大长度(实际上浏览器为 2000 个字符,但其他访问 REST API 的方式可能更高),这将是一种不好的感觉。

    如果用户可以传入这么多数据,则应该在请求正文/数据字段中,而不是在 URL 中。

    【讨论】:

    • 这意味着使用POST,并且根据REST 原则POST 用于在集合中创建条目。还是我错过了什么?
    • 理论上您可以向 GET 请求添加正文,但并非所有客户端都支持它。您必须问自己,将正文添加到 GET 或告诉用户 POST 应该是 GET 的东西,哪个更令人困惑?您可以允许用户在 URL 或正文中指定数据,如果 URL 太长,则告诉他们使用正文。或者你可以增加网络服务器后端允许的#个字符,或者改变数据格式,这样这种情况很少发生......
    • 另一个问题:为什么要写“如果用户可以传入那么多数据,它应该放在请求正文/数据字段中,而不是在URL中。”? 除了大小限制之外,通过 URL 传递冗长数据的缺点是什么?您可以考虑将此信息添加到您的答案中。
    • 特别是因为尺寸限制。
    • 与@smcg 所说的不同,您不能真正在 GET 请求中传递请求正文,因为它很可能在途中被某些东西剥离而无法到达您的服务器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2013-04-21
    相关资源
    最近更新 更多