因此,我在工作时继承了一个应用程序,并且遇到了一些我不太了解的代码。
该应用程序包含一个服务器端API和一个调用它的客户端单页应用程序。Angular中有一个帐户服务,可以调用API进行登录。该API为该API的域设置了一个身份验证Cookie,我们所有人都将继续进行经过身份验证的API请求。
我不明白的是,为什么项目的先前所有者必须对要输入API的数据进行urlencode,并application/x-www-form-urlencoded
为Content-Type
标头包含一个值。
var qs = require('qs');
var user = { username: 'someUser', password: 'somePassword' };
$http.post(`${API_URL}/login`, qs.stringify(user), {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});
然后,此请求将从重定向API_URL/login
到API_URL/account
,该请求将现在登录的帐户对象返回到应用程序。上面的代码都可以正常工作,我只是不完全理解为什么必须对数据进行url编码。如果我删除Content-Type
标题并且不对数据进行url编码,则会收到以下CORS错误(API服务器在本地主机:5000运行,客户端应用在本地主机:3000运行。在服务器上启用了CORS以允许来自localhost:3000的跨域请求):
XMLHttpRequest无法加载http:// localhost:5000 / login。该请求已重定向到“ http:// localhost:5000 / account ”,对于需要预检的跨域请求是不允许的。
var user = { username: 'someUser', password: 'somePassword' };
$http.post(`${API_URL}/login`, user);
谁能解释这是怎么回事?这不像URL编码那样,数据改变了请求被重定向的事实,但是在第一种情况下请求成功并按预期响应,而在第二种情况下抛出CORS错误。
服务器设置为仅接受URL编码的表单数据。删除该标头时,您将发布服务器无法完全理解的原始JSON正文。似乎请求已被重定向到一个帐户路由,该帐户路由不接受其自身域起源之外的HTTP请求。如果发送标头,则应该看到相同的错误
Content-Type: application/json
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句