API REST:414使用GET请求URI太长

API REST:414使用GET请求URI太长,rest,api,curl,get,slim,Rest,Api,Curl,Get,Slim,虽然有很多与这个问题相关的话题,但我仍然找不到解决这个问题的方法 我有一个GET API REST调用,可以非常具体,例如: /v1/书籍?id=40,41,42,43,44,45,46,47 然而,我有时会收到一个414请求URI过长的错误,因为ID列表很长 我已经阅读了与此问题相关的每一个主题,当有许多参数时,我们必须使用POST而不是GET(而不是尝试更改apache中的最大限制,我同意这不是一个好的解决方案) 但我是在找书,不是在造书!RESTAPI非常具体,POST用于创建新条目。 由

虽然有很多与这个问题相关的话题,但我仍然找不到解决这个问题的方法

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

/v1/书籍?id=40,41,42,43,44,45,46,47

然而,我有时会收到一个414请求URI过长的错误,因为ID列表很长

我已经阅读了与此问题相关的每一个主题,当有许多参数时,我们必须使用POST而不是GET(而不是尝试更改apache中的最大限制,我同意这不是一个好的解决方案)

但我是在找书,不是在造书!RESTAPI非常具体,POST用于创建新条目。 由于我使用的是Slim框架,所以如果我调用一个POST来获取书籍,它将需要不同的参数来创建一本新书。Slim无法指定两个不同的POST/v1/books,因为无论您发送的参数如何,它都将始终使用找到的第一个POST/v1/books。。。(我要么去拿书,要么去写书,决不能同时做这两件事)

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

提前谢谢

PS:我使用cURL/PHP使用这个GETAPI,没有JS/AJAX

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

不,POST是为各种各样的东西准备的。看,罗伊·T·菲尔丁

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

指示请求起始行中的目标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来说太长的长度和服务器认为对于有效负载来说太长的长度之间给了您一些喘息的空间()


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

感谢您的反馈!我很惊讶2019年没有简单的解决这个REST问题的方法(我说REST是因为否则我就可以毫无问题地发表文章了)!将内容保存到文件中,然后获取内容是很困难的,因为ID可能是随机的,而且同一个列表肯定不会被调用两次,这将非常昂贵。。。我点击了你的第一个链接,后来它说帖子只有在被用于检索(GET)时才会成为一个问题。基本上,除非我做一个POST/v1/books/getBooks,它杀死了我所有的REST结构,否则我仍然被卡住了……GET是有限的。我知道这一点,但我希望找到一个更“RESTful”的解决方案来解决我的问题,而不是调用POST/v1/books/getBooks,这是解决414错误的唯一解决方案