虽然HTTP 1.1规范似乎允许DELETE请求上的消息体,但它似乎表明服务器应该忽略它,因为它没有定义的语义.
4.3消息正文
服务器应该在任何请求上读取和转发消息体; 如果请求方法不包含实体主体的定义语义,那么在处理请求时应该忽略消息主体.
我已经回顾了有关SO及其他内容的几个相关讨论,例如:
大多数讨论似乎都同意允许在DELETE上提供消息体,但通常不建议这样做.
此外,我注意到各种HTTP客户端库中的趋势,这些库中似乎记录了越来越多的增强功能,以支持DELETE上的请求主体.大多数图书馆似乎都有责任,尽管偶尔会有一些初步阻力.
我的用例要求在DELETE上添加一些必需的元数据(例如删除的"原因",以及删除所需的一些其他元数据).我已经考虑了以下选项,其中任何一个看起来都不合适,并且与HTTP规范和/或REST最佳实践内联:
POST /resourceToDelete { deletemetadata })POST不是删除的语义选项; POST实际上代表了所需的相反操作(即POST创建资源下属;但我需要删除资源)我的第一个偏好可能是使用消息体,第二个是自定义HTTP头; 但是,如上所述,这些方法存在一些缺点.
是否有任何与REST/HTTP标准一致的建议或最佳实践,以便在DELETE请求中包含此类必需的元数据?还有其他我没有考虑的替代方案吗?
我必须使用HttpClient类向具有JSON内容的REST API服务发送删除命令,并且无法使其正常工作.
API调用:
DELETE /xxx/current
{
"authentication_token": ""
}
Run Code Online (Sandbox Code Playgroud)
因为我无法在下面的语句中添加任何内容:
HttpResponseMessage response = client.DeleteAsync(requestUri).Result;
Run Code Online (Sandbox Code Playgroud)
我知道如何使用RestSharp来完成这项工作:
var request = new RestRequest {
Resource = "/xxx/current",
Method = Method.DELETE,
RequestFormat = DataFormat.Json
};
var jsonPayload = JsonConvert.SerializeObject(cancelDto, Formatting.Indented);
request.Parameters.Clear();
request.AddHeader("Content-type", "application/json");
request.AddHeader ("Accept", "application/json");
request.AddParameter ("application/json", jsonPayload, ParameterType.RequestBody);
var response = await client.ExecuteTaskAsync (request);
Run Code Online (Sandbox Code Playgroud)
但我没有RestSharp就完成了.