Reactjs Axios HTTP删除请求返回415错误

Reactjs Axios HTTP删除请求返回415错误,reactjs,http,asp.net-core,axios,Reactjs,Http,Asp.net Core,Axios,我正在构建一个React.js应用程序,以ASP.NET内核作为后端,完成一个教程。我使用Axios处理HTTP请求,我测试了get、post、put请求工作正常,但在del请求过程中不断出现错误。以下是产生相同错误的简化函数: const handleDeleteActivityTest = () => { Axios.delete('https://localhost:5001/api/activities/e2beb0eb-eaaa-49ee-92d8-daf472210

我正在构建一个React.js应用程序,以ASP.NET内核作为后端,完成一个教程。我使用Axios处理HTTP请求,我测试了get、post、put请求工作正常,但在del请求过程中不断出现错误。以下是产生相同错误的简化函数:

  const handleDeleteActivityTest = () => {
    Axios.delete('https://localhost:5001/api/activities/e2beb0eb-eaaa-49ee-92d8-daf472210456');
  }
请求会在控制台中打印以下错误消息:

删除415 (不支持的媒体类型)

createError.js:16未捕获(承诺中)错误:请求失败,状态代码415 在createError(createError.js:16) 结算时(结算js:17) 在XMLHttpRequest.handleLoad(xhr.js:61)

但我在Postman中进行了测试,删除请求工作正常,返回200 OK响应,我可以在数据库中看到条目已被删除:

如果有人能告诉我这里发生了什么,我会非常感激。谢谢你,保持安全和快乐

编辑----------------------------------

下面是处理HTTP请求的后端代码。它分为两部分——1.)接收HTTP请求的控制器和2.)处理HTTP请求的MediatR类:

1.)

名称空间API.Controllers
{
[路由(“api/[控制器]”)]
[ApiController]
公共类活动控制器:控制器数据库
{
专用只读IMediator\u中介;
公共活动控制员(IMediator调解员)
{
_调解人=调解人;
}
[HttpDelete(“{id}”)]
公共异步任务删除(Guid id,Delete.Command)
{
command.Id=Id;
return wait_mediator.Send(命令);
}
}
}
(二)

命名空间应用程序.活动
{
公共类删除
{
公共类命令:IRequest
{
公共Guid Id{get;set;}
}
公共类处理程序:IRequestHandler
{
私有只读数据上下文_上下文;
公共处理程序(DataContext上下文)
{
_上下文=上下文;
}
公共异步任务句柄(命令请求、CancellationToken CancellationToken)
{
var activity=wait_context.Activities.FindAsync(request.Id);
如果(活动==null)
抛出新异常(“找不到活动”);
_删除(活动);
var success=wait_context.SaveChangesAsync()>0;
if(success)返回单位值;
抛出新异常(“保存更改时出现问题”);
}
}
}
}

我发现控制器中的HttpDelete方法接收id作为Guid,但在React应用程序中id类型为string,因此我在控制器和MediatR类中将类型更改为string,但出现相同的http错误415。

Axios不会在删除调用中发送内容类型。看起来ASP.net核心需要内容类型

作为一种解决方法,您可以只在delete调用中添加一个body,然后Axios将添加一个内容类型,这应该可以做到

const handleDeleteActivityTest = () => {
    Axios.delete('https://localhost:5001/api/activities/e2beb0eb-eaaa-49ee-92d8-daf472210456', {
      data: {foo: 'bar'}
    });
  }

Axios不会在删除呼叫中发送内容类型。看起来ASP.net核心需要内容类型

作为一种解决方法,您可以只在delete调用中添加一个body,然后Axios将添加一个内容类型,这应该可以做到

const handleDeleteActivityTest = () => {
    Axios.delete('https://localhost:5001/api/activities/e2beb0eb-eaaa-49ee-92d8-daf472210456', {
      data: {foo: 'bar'}
    });
  }

在其他专家登录之前,我建议您检查并比较您在浏览器和Postman中发送的请求标题。您可以发布ASP.NET控制器/操作方法吗?它是否定义了任何主体参数?看起来您正在邮递员的正文中发送一个空json对象。虽然您可以让它工作,但删除请求不应该有正文,这可能会混淆Axios。是的,我的控制器需要一个带有数据和标题的正文。作为一个临时解决方案,我修改了Axios delete调用,以发送一个body:{data:{foo:{bar},headers:{headers:***'}我将找到一种方法,使控制器不需要一个body来执行删除请求。直到其他专家签入,我建议您检查并比较您在浏览器和Postman中发送的请求标题。您可以发布ASP.NET控制器/操作方法吗?它是否定义了任何主体参数?看起来您正在邮递员的正文中发送一个空json对象。虽然您可以让它工作,但删除请求不应该有正文,这可能会混淆Axios。是的,我的控制器需要一个带有数据和标题的正文。作为一个临时解决方案,我修改了Axios delete调用,以发送一个body:{data:{foo:{bar},headers:{headers:***“}我将找到一种方法,使控制器不需要一个body来执行删除请求。是的,我发现控制器需要一个body和header来执行删除请求。修改Axios删除呼叫后,发送一个正文和标题,效果很好,谢谢!是,发现控制器需要用于删除请求的正文和标题。修改Axios删除呼叫后,发送一个正文和标题,效果很好,谢谢!
const handleDeleteActivityTest = () => {
    Axios.delete('https://localhost:5001/api/activities/e2beb0eb-eaaa-49ee-92d8-daf472210456', {
      data: {foo: 'bar'}
    });
  }