提问者:小点点

获取API获取415不支持的媒体类型使用POST


我试图通过使用FetchAPI调用我自己的API来保存我的数据。但是结果是不断返回415不支持的媒体类型

客户端使用ReactJS.NETCoreMVC.服务器端使用.NETCore WebAPI托管在Windows Server 2012上。

我已经尝试了网络上提供的所有解决方案,但我仍然收到415错误。在IIS方面,我添加了Content-TypeAccept来接受application/jsontext/plase

到目前为止,只有GET方法有效。PUT、POST、DELETE都不起作用。

下面是我在客户端的代码。

        fetch('https://mywebapi.net/api/event/', {
            method: 'POST',
            headers: {
                'Accept': 'application/json, text/plain',
                'Content-Type': 'application/json;charset=UTF-8'
            },
            mode: 'no-cors',
            body: JSON.stringify({
                eventId: 5,
                eventName: "Event 5",
                eventDescription: "Event 5 Description",
                eventLocation: "Kuala Lumpur, Malaysia",
                eventDateTime: "2019-03-28"
            }),
        }).then(response => response.text())
            .then(data => console.log(data))    
            .catch(error => console.log("Error detected: " + error))

如果我删除模式:'no-cors',它将返回500内部服务器错误。

我试过使用。NET使用RestSharp,它能够正常发布,但不能在ReactJS中发布。所以我假设服务器端配置应该是正确的,但不是在客户端。


共2个答案

匿名用户

这绝对是由模式的组合引起的:no-cors和服务器的cors策略。

通过使用mode: no-cors,您可以使用的唯一标头是简单的标头,也就是CORS-safelist请求标头,它只包含application/x-www-form-urlencodedmultipart/form-datatext/普通

这种行为记录在这里:

no-cors-防止方法不是HEAD、GET或POST,防止标头不是简单标头。如果任何ServiceWorker拦截这些请求,它们可能不会添加或覆盖除简单标头之外的任何标头。此外,JavaScript可能不会访问生成的Response的任何属性。这确保了ServiceWorker不会影响Web的语义学,并防止跨域泄漏数据引起的安全和隐私问题。

所以我会:

  1. 从您的请求中删除模式:no-cors
  2. 检查服务器允许的来源,以确保来自浏览器IP的请求是允许的(例如,如果您的react应用程序在http://localhost:3000上运行,请确保http://localhost:3000被显式列为允许的来源。

匿名用户

fetch('https://mywebapi.net/api/event/', {
            method: 'POST',
            headers: {
                'Accept': 'application/json, text/plain',
                'Content-Type': 'application/json;charset=UTF-8'
            },
            mode: 'no-cors',
            body: {
                "eventId": 5,
                "eventName": "Event 5",
                "eventDescription": "Event 5 Description",
                "eventLocation": "Kuala Lumpur, Malaysia",
                "eventDateTime": "2019-03-28"
            },
        }).then(response => response.text())
            .then(data => console.log(data))    
            .catch(error => console.log("Error detected: " + error))

尝试一下,不要对JSON对象进行字符串化,因为它会将其转换为字符串您可以发送JSON对象本身而无需将其转换为字符串。BTW我认为如果我们在react应用程序中代理请求,则无需对每个请求启用CORS。您可以通过在pack. json文件中添加此行来启用代理。

 ,
  "proxy": "http://localhost:5000"

假设您的后端在localhost和端口5000上运行。