来自 Axios 405 或 415 错误的 Vue.js 和 .NET WEBAPI2 POST

Posted

技术标签:

【中文标题】来自 Axios 405 或 415 错误的 Vue.js 和 .NET WEBAPI2 POST【英文标题】:Vue.js and .NET WEBAPI2 POST from Axios 405 or 415 error 【发布时间】:2019-03-11 12:19:56 【问题描述】:

我无法发布到我的 WEBAPI。

我的 ASP.NET WEBAPI 代码如下:

[RoutePrefix("api/Test")]
   public class TestController : ApiController
   
       // GET: api/Test
       [Route]
       public IEnumerable<string> Get()
       
           return new string[]  "value1", "value2" ;
       

       [Route]
       public void Post([FromBody]string value)
       
           Debugger.Break();
       

我的 Vue.js 应用通过 axios 调用如下:

   PostTest()
       alert("Post Test Starting");
       var data = new FormData();
       data.set('value','test');
       //var data = 'value': 'test';
       this.CallAxios('post', 'http://localhost:10000/api/Test/', data, axiosHeaders);
   ,
   CallAxios(callMethod, callURL, callData, callHeaders)
   
     axios(
       method: callMethod,
       url: callURL,
       data: callData,
       headers: callHeaders
     ).then((response) => 
       alert(response.data)
     )
   

我的所有请求的 Content-Type 都设置为 application/json

如果我使用 FormData 部分调用 PostTest Vue 方法并将 [FromBody] 属性保留在 .NET API Post 方法上,我会收到以下 415“不支持的媒体类型”错误:

"Message":"请求实体的媒体类型'multipart/form-data'是 此资源不支持。","ExceptionMessage":"否 MediaTypeFormatter 可用于读取“字符串”类型的对象 来自媒体类型为“multipart/form-data”的内容。",

因此,即使我为 Content-Type 指定了 application/json,它仍然会以 multipart/form-data 的形式出现

如果我将 Vue.js 代码切换为使用“var data = 'value': 'test'”并从 .NET Post 参数中删除 [FromBody] 属性,我会收到以下 405“Method Not允许”错误:

"Message":"请求的资源不支持http方式 '发布'。"

我已经为此奋斗了一段时间。看来我可以执行以下选项之一:

    使用 FormData vue 调用,如何通过 multipart/form-data 问题解决 415 错误? 使用 JSON 字符串如何在 API 调用中支持 POST 动词?

【问题讨论】:

【参考方案1】:

有两种方法可以做到这一点(它们都不会使用 FormData)

1) 作为 Content-Type 发送:application/x-www-form-urlencoded 。为此,您需要使用 qs 之类的库对参数进行 URL 编码。但是,请注意这个特殊的 WebAPI 警告(空键名)

import qs from 'qs';
let myValue = 'FontSpace'
let options = 
    url: '/api/fonts'
    , method: 'post'
    , data: qs.stringify( '': myValue )

let response = await this.$http(options)

如果您在 devtools 中检查请求,您会看到参数被编码为

=字体空间

2) 作为 Content-Type application/json 发送 。为此,您只需 JSON.stringify 值(无键)并在标题中明确指定内容类型

let myValue = 'FontSpace'
let options = 
    headers:  'Content-Type': 'application/json' 
    , url: '/api/fonts'
    , method: 'post'
    , data: JSON.stringify(myValue)

let response = await axios(options)

在 devtools 中检查,您会看到参数被 JSON 编码

“字体空间”

只要您的编码和您的内容类型匹配,WebAPI2 就会接受您的请求。


This documentation was helpful

当参数有 [FromBody] 时,Web API 使用 Content-Type 标头来选择格式化程序。在此示例中,内容类型是“application/json”,请求正文是原始 JSON 字符串(不是 JSON 对象)。

【讨论】:

以上是关于来自 Axios 405 或 415 错误的 Vue.js 和 .NET WEBAPI2 POST的主要内容,如果未能解决你的问题,请参考以下文章

为啥来自 Vuejs 的 Laravel 8 的 AJAX POST 请求会引发 405(不支持的方法)错误?

在使用Vue2.0中使用axios库时,遇到415错误

如何解决错误 405 方法不允许,用于 django graphql 服务器并在前端反应 axios

来自 .net WCF 服务的 405 响应错误

来自 aspx 页面的 Facebook 应用程序出现 405 错误

不允许 axios 发布 405 | Laravel + vue.js