我目前正在设计和实现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.
有没有办法基于Action方法的重载执行参数类型?即是否可以在控制器中执行以下操作
public class MyController : ApiController
{
public Foo Get(int id) { //whatever }
public Foo Get(string id) { //whatever }
public Foo Get(Guid id) { //whatever }
}
Run Code Online (Sandbox Code Playgroud)
如果是这样,需要对Route表进行哪些更改.
为了坚持REST概念,例如安全操作,幂等性等,如何实现涉及多个参数的复杂搜索操作?
我看过谷歌的实施,这很有创意.什么是期权,除此之外?
幂等要求就是绊倒我,因为操作肯定不会为相同的标准返回相同的结果,比如搜索名为"Smith"的客户每次都不会返回相同的结果,因为添加了更多的"Smith"客户每时每刻.我的直觉是使用GET,但对于真正的搜索功能,结果似乎不是幂等的,并且由于其流畅的结果集需要被标记为不可缓存.
所以我和我的老板不同意这里,也找不到任何相关信息.场景:我想获得某个组织的所有用户.URL应该是什么?
mydomain.com/users/by/organisation/{orgId}
要么
mydomain.com/organisation/{orgId}/users
我们的论点:
情况1:呼叫预期返回"用户",因此"资源"(呼叫的第一部分)应该与之相关.
案例2:组织"拥有"/"是用户的父母,因此组织应该是第一位的.
你的想法是什么?
更新:
我不担心之后会发生什么mydomain.com/{resource}.问题主要涉及HTTP操作(GET,POST,PUT,DELETE)是否应与第一个资源相关mydomain.com/users或是否应该反映该关系mydomain.com/organisations/users/.
这是对其他人过滤/查询汽车列表的问题的后续行动.有一个RESTful过滤请求的建议是将过滤器表达式放在URI的查询中,如下所示:
/cars?color=blue&type=sedan&doors=4
Run Code Online (Sandbox Code Playgroud)
没关系.但是如果我的过滤查询变得更复杂并且我需要使用布尔运算符,例如:
((color=blue OR type=sedan) AND doors=4) OR color=red
Run Code Online (Sandbox Code Playgroud)
也就是说,我想找一辆四门蓝色轿车或一辆四门轿车,但如果这辆车是红色的,我会毫不关心任何其他房产.
是否有任何类型的约定在RESTful URI的查询参数中提供布尔表达式?我想我可以通过创建一些新的查询表达式语言并将其放入一个POST,但这似乎是一种沉重而专有的方法.别人怎么解决这个问题?
我正在使用web api 2来实现一个宁静的服务.在对最佳实践进行一些研究之后,每个人似乎都对如何做以下事情有不同的看法.我有一个GET
public HttpResponseMessage Get(string crewId, string shiftDate, int offset = 1, int limit = 10)
Run Code Online (Sandbox Code Playgroud)
此GET方法返回一个列表.有多种方法可以从此方法获取数据.
你(1)将crewId和shiftDate标记为可选吗?
public HttpResponseMessage Get(string crewId = null, string shiftDate = null, int offset = 1, int limit = 10)
Run Code Online (Sandbox Code Playgroud)
然后有一堆if语句来检查填充的内容和未填充的内容以便能够执行操作
if(crewId != null && shiftDate == null){
// Get by crewId
}else if(crewId == null && shiftDate != null){
// Get By shiftDate
}else if(crewId != null && shiftDate != null){
// Get By crewId and shiftDate
} …Run Code Online (Sandbox Code Playgroud) 在 REST API 中使用 * 作为资源 ID 是否明智?我想用它来搜索。我正在使用 RESTEasy 来开发我的网络服务。
假设我有用户资源,用户有姓名和年龄。然后我的 REST API 看起来像:
/users/{id}/name
/users/{id}/age
Run Code Online (Sandbox Code Playgroud)
现在,如果我想显示所有名称,我正在考虑使用以下内容:
/users/*/name
Run Code Online (Sandbox Code Playgroud)
这是正确的还是我应该使用另一种方式?
编辑 1:添加子资源
从答案中建议使用字段查询参数。但是让我们假设我现在想要一些子资源的属性。例如:
/user/*/name/full
/user/*/name/short
Run Code Online (Sandbox Code Playgroud)
如果我遵循字段选项,我将不得不这样做:
/user?fields=name-short
/user?fields=name-full
Run Code Online (Sandbox Code Playgroud)
这并不好,因为 name 的属性以某种方式链接到 name 类。
请考虑这个例子。试着理解这个想法 ;)
首先,我已经阅读了用于搜索的RESTful URL设计以及如何设计RESTful搜索/过滤?的问题.我正在尝试设计更高级的选项,以简单和RESTful方式进行搜索.这些问题的答案给了我一些见解和线索,告诉我如何为搜索/过滤功能设计我以前的应用程序网址模式.
首先,我使用模式为基本过滤选项提出了非常好的简单解决方案:
Equality search: key = val
IN search: key = val1 & key = val2
Run Code Online (Sandbox Code Playgroud)
但随着应用程序的增长,搜索要求也在增长.我最终得到了一些相当不愉快和复杂的网址模式,用于高级搜索选项,其中包括:
Negation search: key-N = val
Like search: key-L = val
OR search: key1-O = val1 & key2 = val2
Range search: key1-RS = val1 & key1-RE = val2
Run Code Online (Sandbox Code Playgroud)
更重要的是,除了过滤器,查询必须获取有关分页和顺序的信息,因此过滤器参数具有F-后缀,按字段排序具有O-后缀,并且分页具有P-后缀.
我希望在这一点上我不必补充说解析这样的请求是相当恶意的任务,如果密钥包含' - '则可能存在歧义.我创建了一些正则表达式来解析它,它现在运行得很好,但......
现在我开始编写一个新的Web应用程序,我有机会从头开始重新设计这个部分.
我想知道在包含所有信息的浏览器中以结构化和不言自明的方式创建对象,并将其作为JSON字符串发送到服务器,如:
filter = {{'type':'like','field':key,'value':val1,'operator':'and','negation':false},..}
Run Code Online (Sandbox Code Playgroud)
但我感到奇怪的是,这不是一个好主意 - 我真的不知道为什么.
所以,这将是我的上下文的定义.现在的问题是:
我正在寻找更简单,更安全的模式来实现高级搜索,包括我上面提到的RESTful GET参数选项 - 你能分享一些想法吗?或者也许是一些关于不以RESTful方式执行此操作的见解?此外,如果你看到JSON方式的一些陷阱,请分享它们.
编辑:
我知道是什么让json成为get参数,不是那么好主意.对它进行编码 - 它使它难看且难以阅读.
由thierry templier发出的链接提供的信息给了我一些思考的东西,我设法在GET参数中设计了更多的有条理和安全的过滤器处理.下面是语法的定义.
对于过滤器 - 多个F参数(每个搜索标准一个):
F = OPERATOR:NEGATION:TYPE:FIELD:VAL[:VAL1,:VAL2...]
Run Code Online (Sandbox Code Playgroud)
允许值: …
我们使用查询字符串中包含大量数据的HTTP GET请求来表示要检索的集合的所有ID。
关于网址中查询字符串长度的限制,谷歌快速搜索显示:
RFC 3986也声明没有限制,但是由于DNS限制,主机名限制为255个字符(第2.3.3节)。Microsoft说,Internet Explorer中URL的最大长度为2,083个字符,URL的路径部分最多不超过2,048个字符。2009年5月1日
如果我们不使用IE,我是否应该担心可能超出查询字符串长度的限制?我确定我已经在Node.js Express服务器上看到了超出的限制,特别是当我在GET请求的查询字符串中包含表示图像的base64字符串时。
解决这个问题的好方法是什么?我们应该只使用HTTP POST请求吗?当然,我们不想为了避免此问题而将1个GET请求分解为1000个。
我现在正面临一个问题.
我们和我们的团队正在使用REST开发新的应用程序.我们面临的问题是我们有时需要获取某种数据并且不知道如何创建URI.
例如.如果我需要一个产品列表,那么api/products /(GET)就可以了.单个产品,api/products/1(GET)
如果我只需要缺货的产品清单,或只剩下1件商品的产品怎么办?
我会用什么URI?我不认为REST可以做到这一点.
谢谢.
BTW:我正在使用VS 2012 Web API.
rest ×8
api ×3
filter ×2
search ×2
uri ×2
c# ×1
get ×1
http ×1
query-string ×1
restful-url ×1
url ×1
web ×1
web-services ×1