将参数添加到GET查询中

时间:2015-02-10 17:34:01

标签: ruby-on-rails http url ruby-on-rails-4 ruby-on-rails-2

我有2个rails应用程序,一个在Rails 2(客户端),另一个在Rails 4(API)中。

问题是有时候我的GET查询有太长的URI。 API正在提出ERROR WEBrick::HTTPStatus::RequestURITooLarge例外。

目前,我只有3个我不喜欢的解决方案:

  • 将GET查询转换为POST / PUT(任何具有请求主体的查询)。我不喜欢它,因为“get”的含义已经没有意义了。我没有放任何东西,不发布任何东西,我只收到信息。 http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html说:

      

    GET方法意味着检索由Request-URI标识的任何信息(以实体的形式)。如果Request-URI引用数据生成过程,则生成的数据应作为响应中的实体而不是过程的源文本返回,除非该文本恰好是过程的输出。 / p>

  • 更改MAX_URI_LENGTH默认值(如http://kandadaboggu.com/post/40618627239/fixing-webrick-httpstatus-requesturitoolarge所做)。对我来说,它只是蹩脚,并不能阻止足够大。

  • 将我的参数添加到headers {{1}}中。对我来说,这是一个不那么糟糕的解决方案。我不知道它是否是标准,可维护,并且很容易为API带回来。

你还有其他解决方案吗?如果你还没有,那么那个不那么糟糕的人呢?

1 个答案:

答案 0 :(得分:0)

您只有真正的限制是URI的长度,以防您在Web浏览器中使用API​​ URL(Internet Explorer的{2,03个字符,KB208427)。< / p>

如果您收到WEBrick::HTTPStatus::RequestURITooLarge例外且您的字符数限制在2,083以下,则只需增加MAX_URI_LENGTH值。这个常量主要是为了防止你的应用程序通过向它发送大量请求而被DOS遗忘。您可能真的需要增加此值。

如果URI长度超过2,083个字符,那么您可能需要将该服务调用重构为多个服务调用(这不是理想的),或者您可以考虑更改URL参数以节省字节数。

例如,假设您需要为某种数据库关系提供ID列表:

foo[bar][0]=123&foo[bar][1]=535&foo[bar][2]=76456

此查询字符串段长度为49个字符。与之相比:

foo[bar]=123,535,76456

只有22个字符,可让你减少约50%的字符。如果您看到多次重复的查询字符串参数或具有长名称的参数,您可以查看这样的微优化。