相关疑难解决方法(0)

带请求正文的HTTP GET

我正在为我们的应用程序开发一个新的RESTful Web服务.

在某些实体上执行GET时,客户端可以请求实体的内容.如果他们想要添加一些参数(例如排序列表),他们可以在查询字符串中添加这些参数.

或者,我希望人们能够在请求正文中指定这些参数. HTTP/1.1似乎没有明确禁止这一点.这将允许他们指定更多信息,可以更容易指定复杂的XML请求.

我的问题:

  • 这完全是一个好主意吗?
  • HTTP客户端在GET请求中使用请求主体会有问题吗?

http://tools.ietf.org/html/rfc2616

rest http http-get

1896
推荐指数
19
解决办法
98万
查看次数

删除一堆项目的宁静方式

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删除.

rest

93
推荐指数
5
解决办法
5万
查看次数

DELETE Request Body的RESTful替代方案

虽然HTTP 1.1规范似乎允许DELETE请求上的消息体,但它似乎表明服务器应该忽略它,因为它没有定义的语义.

4.3消息正文

服务器应该在任何请求上读取和转发消息体; 如果请求方法不包含实体主体的定义语义,那么在处理请求时应该忽略消息主体.

我已经回顾了有关SO及其他内容的几个相关讨论,例如:

大多数讨论似乎都同意允许在DELETE上提供消息体,但通常不建议这样做.

此外,我注意到各种HTTP客户端库中的趋势,这些库中似乎记录了越来越多的增强功能,以支持DELETE上的请求主体.大多数图书馆似乎都有责任,尽管偶尔会有一些初步阻力.

我的用例要求在DELETE上添加一些必需的元数据(例如删除的"原因",以及删除所需的一些其他元数据).我已经考虑了以下选项,其中任何一个看起来都不合适,并且与HTTP规范和/或REST最佳实践内联:

  • 消息正文 - 规范表明DELETE上的消息体没有语义值; HTTP客户端不完全支持; 不是标准做法
  • 自定义HTTP - 需要自定义标头通常违反标准做法 ; 使用它们与我的其余API不一致,其中没有一个需要自定义标头; 此外,没有好的HTTP响应可用于指示错误的自定义标头值(可能是一个单独的问题)
  • 标准HTTP标头 - 没有标准标头是合适的
  • 查询参数 - 添加查询参数实际上会更改要删除的Request-URI; 违反标准做法
  • POST方法 - (例如POST /resourceToDelete { deletemetadata })POST不是删除的语义选项; POST实际上代表了所需的相反操作(即POST创建资源下属;但我需要删除资源)
  • 多个方法 - 将DELETE请求拆分为两个操作(例如,PUT删除元数据,然后删除DELETE)将原子操作拆分为两个,可能会留下不一致的状态.删除原因(和其他相关元数据)不是资源表示本身的一部分.

我的第一个偏好可能是使用消息体,第二个是自定义HTTP头; 但是,如上所述,这些方法存在一些缺点.

是否有任何与REST/HTTP标准一致的建议或最佳实践,以便在DELETE请求中包含此类必需的元数据?还有其他我没有考虑的替代方案吗?

rest http httprequest http-method

86
推荐指数
3
解决办法
6万
查看次数

使用REST删除多个记录

什么是删除多个项目的REST-ful方式?

我的用例是我有一个Backbone Collection,我需要能够一次删除多个项目.选项似乎是:

  1. 发送每条记录的DELETE请求(如果有可能存在数十个项目,这似乎是一个坏主意);
  2. 发送一个DELETE,其中要删除的ID在URL中串在一起(即"/ records/1; 2; 3");
  3. 以非REST方式,发送包含标记为删除的ID的自定义JSON对象.

所有选项都不太理想.

这似乎是REST约定的灰色区域.

api rest backbone.js

80
推荐指数
4
解决办法
5万
查看次数

HttpDelete与身体

我正在尝试使用HttpDelete对象来调用Web服务的delete方法.Web服务的代码从消息的正文中解析JSON.但是,我无法理解如何向HttpDelete对象添加主体.有没有办法做到这一点?

使用HttpPut和HttpPost,我调用setEntity方法并传入我的JSON.HttpDelete似乎没有任何此类方法.

如果无法为HttpDelete对象设置主体,请将我链接到使用超类HttpDelete的资源,以便我可以设置方法(删除)并设置主体.我知道这不太理想,但此时我无法改变网络服务.

android httpclient webservice-client http-delete

40
推荐指数
2
解决办法
2万
查看次数

在Android中发送HTTP DELETE请求

我的客户端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请求中?谢谢.

android httpwebrequest

25
推荐指数
2
解决办法
2万
查看次数

哪种HTTP方法需要正文?

某些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是否必须/应该/必须/不应该在请求中包含消息体.

http

24
推荐指数
2
解决办法
1万
查看次数

AFNetworking HTTP删除使用正文而不是URL

我正在尝试从我的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)

cocoa-touch ios afnetworking afnetworking-2

24
推荐指数
1
解决办法
5151
查看次数

获取PHP删除变量

如果我发出HTTP DELETE,我该如何访问PHP主体/变量?我知道如果您发布POST,您可以通过它访问它$_POST['varname'],但是如果它是DELETE而不是POST ,您如何访问它?假设这里的varname是ID.

php

19
推荐指数
2
解决办法
2万
查看次数

AmbiguousActionException:匹配多个动作.以下操作匹配路由数据并满足所有约束

我正在使用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的回复,但是我想知道为什么我不能为不同的控制器提供相同的操作路径.如果我有许多控制器,每个创建实体,我觉得你提出的解决方案不会很好地扩展.

c# asp.net-core-mvc asp.net-core asp.net-core-routing

19
推荐指数
2
解决办法
3万
查看次数