当前位置: 首页 > 知识库问答 >
问题:

API REST : 414 Request-URI 使用 GET 太长

秦哲瀚
2023-03-14

虽然有很多与此问题相关的主题,但我仍然找不到解决此问题的方法。

我有一个非常具体的GET API REST调用,例如:

/v1/booksid=40,41,42,43,44,45,46,47

然而,由于ID列表很长,有时会出现414请求URI过长的错误。

我读过与这个问题相关的每个主题,当有许多参数时,我们必须使用POST而不是GET(而不是试图改变apache中的max限制,我同意这不是一个好的解决方案)

但是我正在尝试获取书籍,而不是创建书籍!REST API非常具体,POST用于创建新条目。由于我使用的是Slim Framework,如果我调用POST来获取书籍,它会期望不同的html" target="_blank">参数来创建新书。Slim不能指定两个不同的POST /v1/books因为它总是使用它找到的第一个,无论您发送的参数如何...(我要么是获取书籍,要么是创建书籍,永远不会同时使用两者)

那么,我的问题有解决的办法吗?我有点惊讶还没有一个REST解决方案...找了很久,什么也没找到...

提前感谢!

PS:我正在使用cURL/PHP使用这个GET API,其中没有JS/AJAX。

共有1个答案

慕容耘豪
2023-03-14

但我是在找书,不是在造书!RESTAPI非常具体,POST用于创建新条目。

不,邮递是为各种各样的东西准备的。请看罗伊·菲尔丁的《使用POST是可以的》。

当信息对应于一个潜在的资源时,使用POST进行信息检索不是RESTful的,因为这种用法会阻止安全的可重用性和具有URI的网络效应。

414 URI过长表示请求起始行中的target-uri超出了服务器的任意长度限制。由于服务器是其自身资源的权威,它可以自己做出这种决定。

惯用的正确答案是创建一个新资源;也就是说,您将您的信息发布到服务器,服务器创建一个新资源和一个匹配的标识符。例如,服务器可以将您帖子的内容保存到一个随机文件名中,然后将您想要的信息发送回给您,其中包含一个对该文件名进行编码的标识符,以便您以后可以获得任何更新。

POST /v1/books

id=40,41,42,43,44,45,46,47...

201 Created
Location: /v1/book-lists/9d133345-ded1-47ab-a954-a81c1d6d487f
Content-Location: /v1/book-lists/9d133345-ded1-47ab-a954-a81c1d6d487f

-- current representation of /v1/book-lists/9d133345-ded1-47ab-a954-a81c1d6d487f here --

然后,可以向书目列表 URI 发送后续请求以查看表示形式是否已更改。

当然,这不是免费的。必须有人决定他们希望在他们的域应用程序协议中使用它,设计资源,实现查询有效负载的服务器端缓存,等等。

另外,请注意,这实际上并不能解决问题,因为服务器不应该支持任意长(也称为无限长)的请求。在服务器认为目标uri过长的长度和服务器认为有效负载过长的长度(413有效负载过大)之间,它实际上只给了您一些喘息空间。

因此,如果您正在设计一个API,您需要考虑您想要支持哪些用例,这些用例的极端数据长度是多少,并根据您的其他约束选择满足它们的域应用程序协议。

 类似资料:
  • 我的应用程序是一个Java Tomcat WebApp,它使用Dojo js工具包作为我们网页的框架。我的一个表单页面涉及使用 Dojo 的 dojox.layout.ContentPane 将大量字符串数据传递到另一个表单页面。ContentPane传递所有参数并使用GET加载相应的页面,但会导致414 Request-URI太大,因为这超出了Apache的LimitRequestLine。 我

  • 我试图从Google Images搜索结果中保存一幅图像,但是当我在查询字符串参数中发送图像的src时,它给出以下错误: 由于我在本地机器上遇到这个错误,我可以测试你们所有人的想法。 注意:我在文件中将和设置为。但到目前为止没有运气。 感谢任何帮助。

  • 在调用heroku上的REST API时,我遇到了以下错误,该API是用nodejs编写的。 我尝试了这里提到的所有选项,但看起来这个问题是不同的,因此没有帮助。 我正在使用nodejs、Expresjs、body parser。 这在我的本地机器上工作正常,但在heroku中给出了这个错误。 POST 414(请求URI太长)

  • 我正试图通过Synology API更改摄像头通知时间表。 GET请求返回414请求URI太大,POST请求返回405不允许 使用get请求似乎不可能做到这一点。请帮我修复POST请求! 以下是这个方法的文档:第241页SetCameraSchedule https://usdl . synology . com/download/Document/developer guide/Surveill

  • 当我通过postman登录到API时,会生成一个JWT。通过这个jwt,我为特定用户创建数据。但是当我与这个用户和他的JWT连接时,当我用连接的用户的JWT从POSTMAN发出GET请求时,我得到一个400错误,表示请求不好。我不明白为什么。我的Tomcat服务器端口不是8080。。。只需使用GET方法吼叫我的控制器:

  • 因此,当前,当我的webapp发出get请求时,uri如下所示: 用户?USDERID=123 我想要的是 用户/123 我该怎么做? Googleing如何在javascript中发出get请求,当我想要后者时,就会给出前者的URI。 @requestmapping(value=“/users/{userId}”,method=requestmethod.get) 编辑: 因此,我在回复中尝试了