【问题标题】:Angular2 Post Request sends OPTIONS as header from some reasonAngular2 Post Request 由于某种原因将 OPTIONS 作为标头发送
【发布时间】:2017-05-15 15:20:03
【问题描述】:

我似乎无法理解为什么请求没有作为 POST 请求发送 我在NG2中的代码如下:

let headers = new Headers({ 'Content-Type': 'application/json'}); let options = new RequestOptions({ headers: headers , method:RequestMethod.Post }); let content = [ { email:email, password: pass } ]; return this._http.post(this._apiPath, content, options).toPromise() .then(this.extractData) .catch(this.handleErrorPromise);

(我使用来自:http://www.concretepage.com/angular-2/angular-2-http-post-example#example 的示例对其进行了编码)

在我的 PHP 服务器中,我收到以下请求:

[15/May/2017:15:09:32 +0000] "OPTIONS /index.php/api/login HTTP/1.1" 404 90 "http://localhost:4200/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"

当我运行一个简单的 wget 请求时,我在我的 PHP 服务器中收到以下正确的请求:

[15/May/2017:15:02:51 +0000] "POST /index.php/api/login HTTP/1.1" 200 96 "-" "Wget/1.15 (linux -gnu)" web_1 | 2017/05/15 15:02:51 [info] 15#15: *21 客户端 172.18.0.1 关闭 keepalive 连接

这是我使用的 wget 命令:

wget --post-data "email=myemail@gmail.com&password=test" http://localhost/index.php/api/login

任何想法为什么 NG2 不发送 POST 请求? 谢谢。

【问题讨论】:

  • 您不必担心。这只是一个预检请求。

标签: php angular post


【解决方案1】:

这是因为HTTP access control (CORS)

您正在目睹所谓的预检请求。我想这是因为你的内容类型被设置为 json。

一个 OPTIONS 请求几乎是询问服务器是否允许客户端发出请求。

一个请求将被预检...(释义)

...如果 Content-Type 标头的值不是以下值:

  • application/x-www-form-urlencoded
  • 多部分/表单数据
  • 文本/纯文本

您需要在您的服务器上处理此问题。

编辑: Here is a pretty good SO answer on CORS and Preflighting

【讨论】:

  • 如果是服务器问题,我怎么能从 wget 发送正确的请求?还是您指的是 NG2 本地服务器?
  • @user1322801 阅读我发布的链接。 WGET 不会被预检
  • @user1322801 您的服务器需要使用Access-Control-Allow-Origin 标头进行响应
猜你喜欢
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多