REST API URL中的额外查询参数

在我的Rest应用程序中,资源url还支持查询参数,如pageSize,pageNum,name等。所以请求url看起来像

/资源/ {ID}?页次= 1&的pageSize = 25&DESC = “你好”

现在假设一个客户端添加一个额外的查询参数,说’lang’,我的服务器不支持

/ resource / {id}?pageNum = 1&pageSize = 25&desc =“hello”&lang =“eng” ,但我的服务器不支持任何lang参数。

什么应该是最好的设计决定

选项1:忽略额外的无效查询参数并提供请求。

选项2:向客户端抛出错误的请求消息。

感谢Advance Singla

只是忽略它。 大多数其他Web服务器会忽略它不理解的请求参数。

Google会忽略我的两个额外参数https://www.google.com/#q=search+for+something&invalid=param&more=stuff

毫无疑问,客户必须坚持使用Api文档。

但是APis中的某些变化呢(只是一个小的变化,不涉及迁移到新的API版本)

比方说,API资源:/ dummy / api / Iid1支持3个查询参数,即a,b,c

所以完整的URi:/ dummy / api / Id1?a = 1&b = 20&c = 45是API公开的有效请求,所有查询参数,即a,b,c都是可选的参数,即如果这些参数不存在在请求中,服务器将它们处理为某个默认值,如a = 0,b = 0,c = 0

在某些时候,大量客户端基于上述URL方案构建其应用程序。

现在API提供者想要废弃参数’b’并决定抛弃额外/未知参数的exception

这意味着所有客户端应用程序围绕涉及参数“b”的最后一个URL方案构建将失败!

这简单地表明,抛出额外/未知查询参数的exception总是导致客户端和服务器问题的紧密耦合,我想这完全违背了REST原则,这可能具有“完全分离客户端和服务器问题,以便两者可以分开进化’

所以我认为只有缺失/无效的’强制’参数应该抛出exception,而不是选项,永远不会。

我想忽略不良参数是标准做法,但在很多情况下我似乎完全错了。

假设我有一个小部件API,其中包含一个可以找到小部件的小部件集合端点。 窗口小部件具有foo属性,因此以下搜索foo = bar的窗口小部件

GET https://example.com/widgets?foo=bar 

现在一个API客户端犯了错字。

 GET https://example.com/widgets?foi=bar 

而不是只返回foo = bar的小部件,而是默认忽略输入错误并返回所有小部件(适当限制为某些默认大小,因为我制作了精心设计的API)。 我的API客户端可能花费数小时试图找出她的呼叫无效的原因,或者更有可能点亮我的支持网站,想知道为什么我的API很糟糕。

返回400状态是否更好,并显示错误消息,指出“foi”不是可识别的参数? 这似乎特别正确,因为对于请求体中的同类错字,最好的行为是返回400.(例如,请参阅此答案: https : //stackoverflow.com/a/20686925/2716301 )

忽略它是常见模式,但查询参数也是URL(资源ID)的一部分,并且此类请求上的正确响应代码为404 Not Found。

没有一般的设计模式。 你必须问问自己什么是最适合你的用户。 最好告诉他们他们所要求的资源不是以他们需要的格式提供,或者只是给他们另一种资源?

注意

HTTP包含处理语言的强大机制; 请参阅Accept-Language和Content-Language标头(所有浏览器都在使用它)