发出HTTP DELETE请求时,请求URI应完全标识要删除的资源.但是,是否允许添加额外的元数据作为请求的实体主体的一部分?
我目前正在设计和实现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.
是否允许HTTP标头允许的最大允许大小?如果是这样,它是什么?如果没有,这是特定于服务器的东西,还是允许任何大小的标题的公认标准?
因此,我需要设计一个RESTful查询API,它基于一些过滤器返回一组对象.通常的HTTP方法是GET.唯一的问题是,它可以拥有至少十几个过滤器,如果我们将所有这些过滤器作为查询参数传递,则URL可能会变得很长(足够长以被某些防火墙阻止).
减少参数数量不是一种选择.
我能想到的另一种选择是在URI上使用POST方法并将过滤器作为POST主体的一部分发送.这是不是RESTfull(对查询数据进行POST调用).
有没有更好的设计建议?
谢谢
虽然HTTP 1.1规范似乎允许DELETE请求上的消息体,但它似乎表明服务器应该忽略它,因为它没有定义的语义.
4.3消息正文
服务器应该在任何请求上读取和转发消息体; 如果请求方法不包含实体主体的定义语义,那么在处理请求时应该忽略消息主体.
我已经回顾了有关SO及其他内容的几个相关讨论,例如:
大多数讨论似乎都同意允许在DELETE上提供消息体,但通常不建议这样做.
此外,我注意到各种HTTP客户端库中的趋势,这些库中似乎记录了越来越多的增强功能,以支持DELETE上的请求主体.大多数图书馆似乎都有责任,尽管偶尔会有一些初步阻力.
我的用例要求在DELETE上添加一些必需的元数据(例如删除的"原因",以及删除所需的一些其他元数据).我已经考虑了以下选项,其中任何一个看起来都不合适,并且与HTTP规范和/或REST最佳实践内联:
POST /resourceToDelete { deletemetadata }
)POST不是删除的语义选项; POST实际上代表了所需的相反操作(即POST创建资源下属;但我需要删除资源)我的第一个偏好可能是使用消息体,第二个是自定义HTTP头; 但是,如上所述,这些方法存在一些缺点.
是否有任何与REST/HTTP标准一致的建议或最佳实践,以便在DELETE请求中包含此类必需的元数据?还有其他我没有考虑的替代方案吗?
如何使用vanilla JS发送一个AJAX POST请求发送JSON数据.
我理解内容类型是url表单编码,它不支持嵌套的JSON.
有没有什么办法可以在普通的旧JS中使用嵌套的JSON来发出这样的POST请求.我已经尝试了SO上的各种序列化方法,但它们都将我的JSON压缩成一种格式.
这是我的JSON:
{
email: "hello@user.com",
response: {
name: "Tester"
}
}
Run Code Online (Sandbox Code Playgroud) Angular没有添加正确的内容类型选项,我尝试了以下命令:
$http({
url: "http://localhost:8080/example/teste",
dataType: "json",
method: "POST",
headers: {
"Content-Type": "application/json"
}
}).success(function(response){
$scope.response = response;
}).error(function(error){
$scope.error = error;
});
Run Code Online (Sandbox Code Playgroud)
上面的代码生成以下http请求:
POST http://localhost:8080/example/teste HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 0
Cache-Control: no-cache
Pragma: no-cache
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31
Content-Type: application/xml
Accept: application/json, text/plain, */*
X-Requested-With: XMLHttpRequest
Referer: http://localhost:8080/example/index
Accept-Encoding: gzip,deflate,sdch
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: JSESSIONID=C404CE2DA653136971DD1A3C3EB3725B
Run Code Online (Sandbox Code Playgroud)
如您所见,内容类型不是"application/json",而是"application/xml".我在这里错过了什么吗?
让我们假设一个服务提供了一些我可以使用的功能:
GET /service/function?param1=value1¶m2=value2
Run Code Online (Sandbox Code Playgroud)
说我可以在POST查询中使用它是正确的吗?
POST /service/function { param1 : value1, param2 : value2 }
Run Code Online (Sandbox Code Playgroud)
这两个查询是否相同?我可以在任何情况下使用第二个变体,或者文档应该明确说我可以同时使用GET和POST查询吗?
http ×5
rest ×5
api ×3
post ×2
ajax ×1
angularjs ×1
browser ×1
filter ×1
forms ×1
get ×1
http-headers ×1
http-method ×1
httprequest ×1
javascript ×1
json ×1
limit ×1
search ×1
url ×1