javascript - 有人可以解释这两个 http 调用之间的区别以及为什么一个失败而另一个没有失败吗?

标签 javascript angularjs rest http cors

所以我在工作中继承了一个应用程序,但遇到了一些我不完全理解的代码。

该应用程序由一个服务器端 API 和一个调用它的客户端单页应用程序组成。 Angular 中有一个帐户服务调用 API 进行登录。 API 为 API 的域设置了一个身份验证 cookie,我们都准备好发出经过身份验证的 API 请求。

我不明白的一点是,为什么该项目的前任所有者必须对发送到 API 的数据进行 urlencode,并为 Content-Type header 。

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 header 并且不对数据进行 url 编码,则会收到以下 CORS 错误(API 服务器在本地主机上运行:5000,客户端应用程序在本地主机上本地运行: 3000. 服务器上启用了 CORS 以允许来自 localhost:3000 的跨源请求):

XMLHttpRequest cannot load http://localhost:5000/login. The request was redirected to 'http://localhost:5000/account', which is disallowed for cross-origin requests that require preflight.

var user = { username: 'someUser', password: 'somePassword' };
$http.post(`${API_URL}/login`, user);

谁能解释一下这是怎么回事?这不像 URL 编码数据正在改变请求被重定向的事实,但它在第一种情况下成功并按预期响应,但在第二种情况下抛出 CORS 错误。

最佳答案

服务器设置为只接受 URL 编码的表单数据。当您删除该 header 时,您将发布一个服务器不太理解的原始 JSON 正文。看起来请求被重定向到一个帐户路由,该路由不接受其域源之外的 HTTP 请求。如果您发送 header ,您应该会看到相同的错误

Content-Type: application/json

关于javascript - 有人可以解释这两个 http 调用之间的区别以及为什么一个失败而另一个没有失败吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36508200/

相关文章:

Javascript - 数组赋值

javascript - JS 自动完成。 AJAX 与 JS 对象/数组

javascript - 如何使用 Angular ng include 在 symfony 中加载 twig 文件

html - AngularJS:使用 ng-repeat 动态加载 CSS 样式表

c# - ASP.NET Core WebApi HttpResponseMessage 创建自定义消息?

java - Tomcat 上的 ClassNotFoundException : javax. persistence.EntityListeners

javascript - 无法在文本字段中提供 "dot"输入

javascript - 如何列出 React 项目中未使用的节点模块/依赖项?

javascript - Angularjs 100 个具有相同布局的页面

apache - HADOOP/YARN - ResourceManager 和 hdfs NameNode 是否总是安装在同一台主机上?