它依赖于浏览器吗?另外,不同的Web堆栈对于从请求中获取的数据量有不同的限制吗?
我目前正在设计和实现PHP中的RESTful API.但是,我没有成功实施我的初始设计.
GET /users # list of users
GET /user/1 # get user with id 1
POST /user # create new user
PUT /user/1 # modify user with id 1
DELETE /user/1 # delete user with id 1
Run Code Online (Sandbox Code Playgroud)
到目前为止标准相当,对吗?
我的问题是第一个问题GET /users
.我正在考虑在请求正文中发送参数来过滤列表.这是因为我希望能够在不获取超长URL的情况下指定复杂的过滤器,例如:
GET /users?parameter1=value1¶meter2=value2¶meter3=value3¶meter4=value4
Run Code Online (Sandbox Code Playgroud)
相反,我希望有类似的东西:
GET /users
# Request body:
{
"parameter1": "value1",
"parameter2": "value2",
"parameter3": "value3",
"parameter4": "value4"
}
Run Code Online (Sandbox Code Playgroud)
它更具可读性,为您提供设置复杂过滤器的绝佳机会.
无论如何,file_get_contents('php://input')
没有返回请求的请求体GET
.我也尝试过http_get_request_body()
,但我正在使用的共享主机没有pecl_http
.不确定它会有所帮助.
我发现了这个问题,并意识到GET可能不应该有一个请求体.这有点不确定,但他们建议不要这样做.
所以现在我不知道该怎么做.你如何设计RESTful搜索/过滤功能?
我想我可以使用POST
,但这似乎不太RESTful.
我正在寻找一种合理的方式将搜索表示为RESTful URL.
设置:我有两个模型,汽车和车库,汽车可以在车库.所以我的网址看起来像:
/car/xxxx
xxx == car id
returns car with given id
/garage/yyy
yyy = garage id
returns garage with given id
Run Code Online (Sandbox Code Playgroud)
汽车可以独立存在(因此/汽车),也可以存在于车库中.例如,在给定车库中代表所有车辆的正确方法是什么?就像是:
/garage/yyy/cars ?
Run Code Online (Sandbox Code Playgroud)
车库yyy和zzz中的汽车联盟怎么样?
什么是代表搜索具有某些属性的汽车的正确方法?说:给我看看所有带4扇门的蓝色轿车:
/car/search?color=blue&type=sedan&doors=4
Run Code Online (Sandbox Code Playgroud)
或者它应该是/汽车而不是?
使用"搜索"似乎不合适 - 什么是更好的方式/术语?应该只是:
/cars/?color=blue&type=sedan&doors=4
Run Code Online (Sandbox Code Playgroud)
搜索参数应该是PATHINFO还是QUERYSTRING的一部分?
简而言之,我正在寻找跨模型REST网址设计和搜索的指导.
[更新]我喜欢贾斯汀的答案,但他没有涉及多字段搜索案例:
/cars/color:blue/type:sedan/doors:4
Run Code Online (Sandbox Code Playgroud)
或类似的东西.我们怎么样
/cars/color/blue
Run Code Online (Sandbox Code Playgroud)
到多场案件?
因此,我需要设计一个RESTful查询API,它基于一些过滤器返回一组对象.通常的HTTP方法是GET.唯一的问题是,它可以拥有至少十几个过滤器,如果我们将所有这些过滤器作为查询参数传递,则URL可能会变得很长(足够长以被某些防火墙阻止).
减少参数数量不是一种选择.
我能想到的另一种选择是在URI上使用POST方法并将过滤器作为POST主体的一部分发送.这是不是RESTfull(对查询数据进行POST调用).
有没有更好的设计建议?
谢谢
如http://www.boutell.com/newfaq/misc/urllength.html中所述,HTTP查询字符串的长度有限.它可能受客户端(Firefox,IE,...),服务器(Apache,IIS,...)或网络设备(应用防火墙......)的限制.
今天我用搜索表单来解决这个问题.我们开发了一个包含很多字段的搜索表单,这个表单作为GET请求发送到服务器,因此我可以将结果页面添加为书签.
我们有很多字段,我们的查询字符串长度为1100字节,我们有一个防火墙可以丢弃超过1024字节的HTTP GET请求.我们的系统管理员建议我们使用POST,这样就没有限制.
当然,POST会起作用,但我真的觉得搜索是一个GET而不是POST.所以我想我会检查我们的字段名称,以确保查询字符串不会太长,如果我不能,我会务实并使用POST.
但RESTful服务的设计是否存在缺陷?如果我们在GET请求中的长度有限,我该如何将大对象发送到RESTful Web服务?例如,如果我有一个基于文件进行计算的程序,我想提供这样的RESTful Web服务:http://compute.com?content=<base64 file>
.这不起作用,因为查询字符串不具有无限长度.
我有点不解......
假设我有一个单页应用程序,它使用第三方API作为内容.应用程序的逻辑仅在浏览器中,并且没有我可以写入的后端.
为了允许深度链接到应用程序的状态,我使用pushState来跟踪确定应用程序状态的一些变量(注意Ubersicht的公共版本还没有这样做).在这种情况下repos
,labels
,milestones
和username
,show_open
(布尔)和with_comments
(布尔)和without_comments
(布尔).URL格式是?label=label_1,label_2,label_3&repos=repo_1…
.值通常是嫌疑人,大致[a-zA-Z][a-zA-Z0-9_-]
或任何布尔指标.
到现在为止还挺好.现在,因为查询字符串可能有点长而且不实用,并且我希望能够传递类似http://espy.github.io/ubersicht/?state=SOMOPAQUETOKENTHATLOSSLESSLYDECOMPRESSESINTOTHEORIGINALVALUES#hoodiehq
的URL ,越短越好.
我的第一次尝试是使用一些类似zlib的算法(https://github.com/imaya/zlib.js)和@flipzagging指向antirez/smaz(https // github.com/antirez/smaz)听起来更适合短字符串(JavaScript版本在https://github.com/personalcomputer/smaz.js).
由于=
和&
没有具体处理https://github.com/personalcomputer/smaz.js/blob/master/lib/smaz.js#L9,我们也许能够调整的东西有一点点.
此外,还有一个选项可以对固定表中的值进行编码,例如,参数的顺序是预定义的,我们需要跟踪的是实际值.例如,可能在smaz压缩之前a=hamster&b=cat
变成7hamster3cat
(长度+字符)或仓鼠|猫(值+ |
).
还有什么我应该找的吗?
browser ×4
rest ×4
url ×3
api ×2
http ×2
compression ×1
filter ×1
javascript ×1
max ×1
query-string ×1
search ×1