client.DeleteAsync - 在正文中包含对象

Posted

技术标签:

【中文标题】client.DeleteAsync - 在正文中包含对象【英文标题】:client.DeleteAsync - include object in body 【发布时间】:2017-03-25 16:05:55 【问题描述】:

我有一个 ASP.NET MVC 5 网站 - 在 C# 客户端代码中,我使用 HttpClient.PutAsJsonAsync(path, myObject) 很好地调用 Json API(该 API 也是我在 Web API 中创建的)。

client.BaseAddress = new Uri("http://mydomain");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.PutAsJsonAsync("api/something", myObj);

我想对删除动词做同样的事情。但是client.DeleteAsync 不允许在主体中传递对象。 (我想在 URI 中将删除的原因与要删除的项目的 Id 一起记录)。

有没有办法做到这一点?

【问题讨论】:

我能知道你为什么要在 Delete 方法中传递一个对象吗?你可以在你的 URL 中传递一个 ID 将其作为参数传递。并在动作上重建您的复杂对象模型 @niico 看看这里的一些答案。 ***.com/questions/14323716/… 我更偏爱DELETE /api/path/id/reason 但同样(主要基于意见) 第三个考虑它的选项是查询字符串。将它放在路径中违反了 REST,因为它不是资源身份/位置的一部分,所以我不会这样做。因为它只是一个单一的字符串值,所以查询字符串是我的第一选择,正文是我的第二选择。 【参考方案1】:

由于更高级别的DeleteAsync 不支持主体,因此您必须在方便性方面稍作放弃,但“很长的路要走”仍然非常简单:

var request = new HttpRequestMessage 
    Method = HttpMethod.Delete,
    RequestUri = new Uri("http://mydomain/api/something"),
    Content = new StringContent(JsonConvert.SerializeObject(myObj), Encoding.UTF8, "application/json")
;
var response = await client.SendAsync(request);

【讨论】:

谢谢。似乎在 DELETE 中使用 body 是非常规的,因此不是一个好主意?! 不典型但并非闻所未闻。不久前,我得到了一个 request 来将它容纳在我的 Flurl 库中。 显然 RFC 7231 规定:“删除 - 没有定义的正文语义。” - 不符合标准似乎是个坏主意? 您在规范中的什么地方看到的?我现在正在看它,但我在任何地方都看不到。 alix axel 的回答:***.com/questions/5905916/…

以上是关于client.DeleteAsync - 在正文中包含对象的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Axios 中发送带有 JSON 正文的 get 请求?

如何使用 HttpURLConnection 在请求正文中发送数据?

在正文字段中写入的小模块

如何在 AFHTTPSessionManager 请求中添加原始正文?

在电子邮件正文中显示附加图像

如何在mailcore2中获取电子邮件正文