在设计RESTful API时,如果GET请求仅在有与请求关联的特定参数时才有意义,该怎么办?参数是否应作为查询字符串传递,如果是,如果未指定所有参数或格式不正确,该怎么办?
例如,假设我有一个Post资源,可以通过`api / posts`端点访问。每个帖子都有一个地理位置,只有在指定帖子可能所在的区域时才能检索帖子。因此,需要3个参数:纬度,经度和半径。
在这种情况下,我可以想到两个选项:
1.将参数放在查询字符串中:api/posts/?lat=5.54158&lng=71.5486&radius=10
2.将参数放在URL中:api/posts/lat/5.54158/lng/71.5486/radius/10
哪种方法是正确的?将所需参数放入查询字符串似乎是错误的,但后一种方法感觉有点“丑陋”。
PS。我知道有很多关于这个主题的讨论(例如:REST API Best practices: Where to put parameters?),但我的问题专门针对需要参数的情况,而不是可选的。
答案 0 :(得分:14)
第一种方法更好。
api/posts/?lat=5.54158&lng=71.5486&radius=10
第二种方法有点误导。
api/posts/lat/5.54158/lng/71.5486/radius/10
您应该将每个目录视为资源。在这个原因中,子资源(例如:" api / posts / lat / 5.54158")不是真正的资源,因此具有误导性。在某些情况下,这种模式是一种更好的解决方案,但在查看给出的内容时,我会使用查询字符串。除非您有一些实体链接将您直接链接到此网址,否则我不太喜欢它。
答案 1 :(得分:4)
您应该将所有内容放入查询字符串中,并将服务器设置为在未收到3个必需参数时返回错误代码。
因为它是一组识别对象的参数。
举个例子: LAT = 5.54158; lng = 71.5486 radius = 10
这个网址不太可能有意义:
api/posts/lat/5.54158/lng/yyyy/radius/zz
与以下内容不同:
api/memb/35/..
因为id为35的成员可以拥有许多函数(因此,有效的URL):
api/memb/35/status
或
api/memb/35/lastlogin
答案 2 :(得分:2)
在设计RESTful API时,如果只有GET请求,该怎么办 感觉是否有与请求相关的特定参数? 参数应该作为查询字符串传递,如果是,那么该怎么做 在未指定或格式化所有参数时执行此操作 不正确?
通过REST,您的API必须满足REST约束,Fielding dissertation中对此进行了描述。其中一个约束是统一接口约束,其中包括HATEOAS constraint。根据HATEOAS约束,您的API必须提供标准的超媒体格式作为响应。该超媒体包含用元数据(例如,链接关系或RDF注释)注释的超链接(例如,HTML链接,表单)。客户端检查元数据,向他们解释超链接的作用。之后,他们可以决定是否要关注链接。当他们关注链接时,他们可以根据URI模板,参数等构建HTTP请求...并将其发送到REST服务。
在您的情况下,使用哪种URI结构并不重要,它仅用于服务用途,因为客户端始终使用给定的URI模板,并且客户端不关心该模板中的内容,直到它是有效的URI模板它可以填充参数。
在大多数情况下,您的客户端都有足够的验证信息来测试参数是否不正确或缺失。在这种情况下,它不会发送HTTP请求,因此您无需在服务中执行任何操作。如果无效的参数通过,那么在您的情况下,您的服务会发回404 - 未找到,因为URI是资源标识符,并且没有资源属于无效的URI(从给定的URI模板和无效的参数生成)。 / p>