标题中没有 no-cors 无法获取 POST

新手上路,请多包涵

在提出这样的要求时:

 return fetch(
            'http://localhost:8000/login',
            {   method: 'POST',
                headers: new Headers(
                   {"Content-Type": "application/json",
                    "Accept":"application/json"}
                ),

                body: JSON.stringify(
                   {'name': 'Tom', 'password': 'Soyer'}
                )
             }
           ).then( response => { console.log(response);})
            .catch(err => console.log(err))

请求使用方法 OPTIONS 而不是 POST 运行。仅在添加模式时:’no-cors’ 请求变为 POST:

 return fetch(
            'http://localhost:8000/login',
            {   method: 'POST',
                mode: 'no-cors',
                headers: new Headers(
                   {"Content-Type": "application/json",
                    "Accept":"application/json"}
                ),
                body: JSON.stringify(
                   {'name': 'Tom', 'password': 'Soyer'}
                )
             }
           ).then( response => { console.log(response);})
            .catch(err => console.log(err))

但响应不正常(即使网络响应状态为 200):{type: “opaque”, url: “”, status: 0, ok: false, statusText: ““…} 我想是因为

Content-Type 标头的唯一允许值是:application/x-www-form-urlencoded multipart/form-data text/plain

此处描述 https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

有什么方法可以通过获取来实时发布 POST json 数据吗?

原文由 htochko 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 243
1 个回答

您发送的自定义 Content-Type 标头会导致您的请求进行预检,这意味着将在实际 POST 请求 之前 发送包含有关即将发送的 POST 请求的一些元数据的 OPTIONS 请求。

您的服务器需要准备好处理此 OPTIONS 请求。您没有指定服务器的内容,但是以 express 为例,您可以注册一个中间件来拦截所有“OPTIONS”请求,设置 Access-Control-Allow-Origin: *Access-Control-Allow-Headers: Content-Type 标头,并以 200 响应。

如果您可以使用 ‘Content-Type’: ‘text/plain’ 标头发出请求,那将解决您的问题。或者,您可以使用完全绕过 XHR 的东西,例如 JSONP。

原文由 Asad Saeeduddin 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题