为啥在我的 Angular 2 应用程序中发送 OPTIONS 请求而不是 PUT? [复制]

Posted

技术标签:

【中文标题】为啥在我的 Angular 2 应用程序中发送 OPTIONS 请求而不是 PUT? [复制]【英文标题】:Why is an OPTIONS request sent instead of a PUT in my Angular 2 app? [duplicate]为什么在我的 Angular 2 应用程序中发送 OPTIONS 请求而不是 PUT? [复制] 【发布时间】:2017-05-17 17:19:54 【问题描述】:

我正在尝试执行模型的更新功能,尝试通过 PUT 调用 API 中的 Update 方法。

这是我的服务客户端:

import  Injectable  from '@angular/core';
import  Http, Headers, RequestOptions, RequestMethod, Response  from '@angular/http';
import 'rxjs/add/operator/toPromise';

[...]

    updateClients(client_id, data)
        let headers = new Headers( 'Content-Type': 'application/json' );

              let body = JSON.stringify(data);

              return this.http.put(`$this.baseUrl/client/`+client_id, body, headers)
                .toPromise()
                .then(response => response.json().data)
                .then(items => items.map((item, idx)  => 
                  return
                    id: item.id
                  ;
                ));
    

但它不起作用,因为该方法通过 OPTIONS 而不是 PUT。在我的浏览器控制台中会出现:XMLHttpRequest can not loadhttp://ip/api/client/5. Method PUT is not allowed by Access-Control-Allow-Methods in preflight response.

但是,在 API (Laravel 5.3) 中启用了 PUT 方法。我已经用 POSTMAN 试过了,它的工作原理。在我的回复标题中:

Access-Control-Allow-Origin: *
Allow: GET, HEAD, PUT, PATCH, DELETE
Cache-Control: no-cache
Connection: keep-alive

为什么它是通过选项请求而不是 put 来的? POST 方法适用于角度 2。

【问题讨论】:

【参考方案1】:

OPTIONS 是在某些 CORS 情况下由浏览器自动发送的预检请求。如果服务器没有响应预期的 CORS 标头(Access-Control-Allow-Origin 和其他标头),则浏览器根本不会发出 PUT 请求。

您需要配置服务器以响应预期的标头,以便能够直接从 Angular(或一般的 JS)使用此服务器

【讨论】:

以上是关于为啥在我的 Angular 2 应用程序中发送 OPTIONS 请求而不是 PUT? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Angular 应用程序没有拿起可动手做的 CSS?

为啥 Angular 无法识别用户是不是使用 keycloak 登录?

如何从Angular向同一域上的Laravel API发送请求?

为啥我的 Angular 2 应用程序中的 Web 套接字已关闭,尽管我还没有明确关闭它?

为啥我不能在 Angular ngFor 循环中设置我的第一个单词的样式?

为啥控制器发送的 html 代码显示在我的页面中? [复制]