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 在请求正文中发送数据?