我正在为我们的应用程序开发一个新的RESTful Web服务.
在某些实体上执行GET时,客户端可以请求实体的内容.如果他们想要添加一些参数(例如排序列表),他们可以在查询字符串中添加这些参数.
或者,我希望人们能够在请求正文中指定这些参数. HTTP/1.1似乎没有明确禁止这一点.这将允许他们指定更多信息,可以更容易指定复杂的XML请求.
我的问题:
在REST的wiki文章中 指出,如果您使用http://example.com/resources DELETE,则表示您正在删除整个集合.
如果您使用http://example.com/resources/7HOU57Y DELETE,则表示您正在删除该元素.
我正在做一个网站,请注意不要WEB服务.
我有一个列表,列表中的每个项目都有1个复选框.一旦我选择了多个要删除的项目,我将允许用户按下名为DELETE SELECTION的按钮.如果用户按下按钮,将弹出一个js对话框,要求用户确认删除.如果用户确认,则删除所有项目.
那么我应该如何满足以RESTFUL方式删除多个项目?
注意,目前对于网页中的DELETE,我所做的是使用带有POST作为操作的FORM标签,但是包含值为DELETE的_method,因为这是其他人在SO中指示如何对网页进行RESTful删除.
虽然HTTP 1.1规范似乎允许DELETE请求上的消息体,但它似乎表明服务器应该忽略它,因为它没有定义的语义.
4.3消息正文
服务器应该在任何请求上读取和转发消息体; 如果请求方法不包含实体主体的定义语义,那么在处理请求时应该忽略消息主体.
我已经回顾了有关SO及其他内容的几个相关讨论,例如:
大多数讨论似乎都同意允许在DELETE上提供消息体,但通常不建议这样做.
此外,我注意到各种HTTP客户端库中的趋势,这些库中似乎记录了越来越多的增强功能,以支持DELETE上的请求主体.大多数图书馆似乎都有责任,尽管偶尔会有一些初步阻力.
我的用例要求在DELETE上添加一些必需的元数据(例如删除的"原因",以及删除所需的一些其他元数据).我已经考虑了以下选项,其中任何一个看起来都不合适,并且与HTTP规范和/或REST最佳实践内联:
POST /resourceToDelete { deletemetadata })POST不是删除的语义选项; POST实际上代表了所需的相反操作(即POST创建资源下属;但我需要删除资源)我的第一个偏好可能是使用消息体,第二个是自定义HTTP头; 但是,如上所述,这些方法存在一些缺点.
是否有任何与REST/HTTP标准一致的建议或最佳实践,以便在DELETE请求中包含此类必需的元数据?还有其他我没有考虑的替代方案吗?
什么是删除多个项目的REST-ful方式?
我的用例是我有一个Backbone Collection,我需要能够一次删除多个项目.选项似乎是:
所有选项都不太理想.
这似乎是REST约定的灰色区域.
我正在尝试使用HttpDelete对象来调用Web服务的delete方法.Web服务的代码从消息的正文中解析JSON.但是,我无法理解如何向HttpDelete对象添加主体.有没有办法做到这一点?
使用HttpPut和HttpPost,我调用setEntity方法并传入我的JSON.HttpDelete似乎没有任何此类方法.
如果无法为HttpDelete对象设置主体,请将我链接到使用超类HttpDelete的资源,以便我可以设置方法(删除)并设置主体.我知道这不太理想,但此时我无法改变网络服务.
我的客户端API指定要删除对象,必须发送DELETE请求,其中包含描述内容的Json头数据.实际上它与添加对象的调用相同,这是通过POST完成的.这工作正常,我的代码的内容如下:
HttpURLConnection con = (HttpURLConnection)myurl.openConnection();
con.setRequestMethod("POST");
con.setDoOutput(true);
con.setUseCaches(false);
con.connect();
OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream());
wr.write(data); // data is the post data to send
wr.flush();
Run Code Online (Sandbox Code Playgroud)
要发送删除请求,我将请求方法更改为"DELETE".但是我收到以下错误:
java.net.ProtocolException: DELETE does not support writing
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是,如何从Android发送包含标题数据的DELETE请求?我错过了这一点 - 您是否能够将标题数据添加到DELETE请求中?谢谢.
某些HTTP方法(例如POST,需要在标题和double之后发送正文)CRLF.
其他人,例如GET,没有身体,对他们而言,双重CRLF标志着请求的结束.
但对于其他人:PUT,DELETE...怎么知道哪一个需要的身体吗?
通用HTTP客户端应如何对未知的HTTP方法做出反应?拒绝吗?默认情况下需要正文,或者默认情况下不需要正文?
可以理解指向相关规范的指针.
编辑:正如评论中所述,我将详细介绍我的问题.
我正在设计一个通用的HTTP 客户端,程序员可以使用它来向任何服务器发送任意HTTP请求.
客户端可以像这样使用(伪代码):
HttpClient.request(method, url [, data]);
Run Code Online (Sandbox Code Playgroud)
数据是可选的,可以是原始数据(字符串),也可以是键/值对的关联数组.
如果数据是数组,则库将对数据进行url编码,然后将数据附加到GET请求的URL ,或者将其发送到消息正文中以获取POST请求.
因此,考虑到开发人员选择的HTTP方法,我正在尝试确定此HttpClient是否必须/应该/必须/不应该在请求中包含消息体.
我正在尝试从我的iOS应用程序向RESTful Django Web服务发送HTTP DELETE请求.我使用AFNetworking 2.0(2.4).
在分析了AFHTTPREquestOperation我的API调用的成功块后,我发现请求的主体是零.参数URL在URL中编码和发送.
<AFHTTPRequestOperation: 0x10c587940,
state: isFinished,
cancelled: NO
request: <NSMutableURLRequest: 0x10c521ab0> {
URL: https://anURL.com/connections?data%5Bconnections%5D%5B%5D%5Bid%5D=106 },
response: <NSHTTPURLResponse: 0x10c5c7590> {
URL: anURL.com/
connections?data%5Bconnections%5D%5B%5D%5Bid%5D=106
}
{ status code: 200, headers {
Connection = "Keep-Alive";
"Content-Type" = "application/json";
Date = "Tue, 05 Aug 2014 14:07:53 GMT";
"Keep-Alive" = "timeout=5, max=100";
Server = "Apache/2.4.7 (Ubuntu)";
"Transfer-Encoding" = Identity;
} }>
Run Code Online (Sandbox Code Playgroud)
现在我想知道是否可以在请求正文中发送参数,就像使用HTTP POST而不是在URL中发送它们一样.那可能吗?
如何使用AFNetworking做到这一点?
我如何发送atm:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer …Run Code Online (Sandbox Code Playgroud) 如果我发出HTTP DELETE,我该如何访问PHP主体/变量?我知道如果您发布POST,您可以通过它访问它$_POST['varname'],但是如果它是DELETE而不是POST ,您如何访问它?假设这里的varname是ID.
我正在使用ASP.NET Core MVC创建一个网站.当我点击某个动作时,我收到此错误:
AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied:
Web.Controllers.ChangeEventsController.Create (Web)
Web.Controllers.ProductsController.CreateChangeEvent (Web)
Run Code Online (Sandbox Code Playgroud)
这就是我在我的ProductsController的index.cshtmlm中定义我的动作的方法:
<a asp-controller="ChangeEvents" asp-action="Create" asp-route-id="@item.Id">Create Change Event</a>
Run Code Online (Sandbox Code Playgroud)
这是我的路线:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
Run Code Online (Sandbox Code Playgroud)
以下是我定义操作的方式:
// ChangeEventsController
[HttpGet("{id}")]
public IActionResult Create(Guid id)
// ProductsController
[HttpGet("{id}")]
public IActionResult CreateChangeEvent(Guid id)
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
更新
感谢@MegaTron的回复,但是我想知道为什么我不能为不同的控制器提供相同的操作路径.如果我有许多控制器,每个创建实体,我觉得你提出的解决方案不会很好地扩展.
rest ×4
http ×3
android ×2
afnetworking ×1
api ×1
asp.net-core ×1
backbone.js ×1
c# ×1
cocoa-touch ×1
http-delete ×1
http-get ×1
http-method ×1
httpclient ×1
httprequest ×1
ios ×1
php ×1