使用 $http.delete 从 angular 发布到 aspnetcore api 时出现不受支持的媒体类型错误

Elm*_*ega 4 angularjs asp.net-core

发布到 aspnetcore api 时,我收到 415 http 错误结果。如果我的端点标记为 [HttpPost] 而不是 [HttpDelete],则不会发生这种情况

在 aspnetcore api 控制器中:

[HttpDelete]
public async Task<IActionResult> Delete([FromBody]EntityViewModel vm)
{
Run Code Online (Sandbox Code Playgroud)

在角度控制器中:

 var obj = new Object();
 obj.atr1 = 1;
 obj.atr2 = 2 ;

 $http.post(route, obj)
    .then(function (response) {
Run Code Online (Sandbox Code Playgroud)

实体视图模型.cs

public class EntityViewModel
    {
        public int Atr1 { get; set; }
        public int Atr2 { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

Ral*_*ing 6

先读了你的问题,我有点困惑......

为什么 a$http.post用于发出 DELETE 请求?为什么$http.delete不用于此目的?然后我阅读了有关 AngularJS 的更多信息$http.delete,发现您无法将正文发送到服务器。然后我问自己,为什么你可以在 DELETE 请求中发送一个正文。这里有一个很好的问题:HTTP DELETE 请求是否允许实体主体?- 规范允许带有正文数据的 DELETE 请求。

使长话短说...

ASP.NET Core 可以处理带有在正文中发送的 JSON 数据的 DELETE 请求。所以控制器部分是有效的。

[HttpDelete]
public async Task<IActionResult> Delete([FromBody]EntityViewModel vm)
{
Run Code Online (Sandbox Code Playgroud)

为了避免状态代码 415(不支持的媒体类型),将 Header 字段Content-Type设置为 非常重要application/json。我在以 Postman 作为客户端的实验中忘记了这一点,并且也得到了 415 状态代码。

对于 AngularJS 部分,我建议使用

var obj = new Object();
obj.atr1 = 1;
obj.atr2 = 2 ;

$http(
  {
    method: 'DELETE',
    url: route,
    headers: {
        'Content-Type': 'application/json'
    },
    data: obj
  }
).then(function (response) {
Run Code Online (Sandbox Code Playgroud)