我有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带回来。
你还有其他解决方案吗?如果你还没有,那么那个不那么糟糕的人呢?
答案 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%的字符。如果您看到多次重复的查询字符串参数或具有长名称的参数,您可以查看这样的微优化。