【问题标题】:Angular 5: HTTP post `Response for preflight has invalid HTTP status code 400.`Angular 5:HTTP 发布“预检响应具有无效的 HTTP 状态代码 400。”
【发布时间】:2018-09-13 04:43:32
【问题描述】:

我有以下服务;无论我如何配置它,我都无法让 http 请求正常工作。

Chrome 控制台错误 Response for preflight has invalid HTTP status code 400.

我的服务

import { Injectable } from '@angular/core';
import { Http, RequestOptions, Response, Headers } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';



@Injectable()
export class SlackService {
    extractData(res: Response) {
        let body = res.json();
        return body || {};
    }
    handleError (error: Response | any) {
        console.error(error.message || error);
        return Promise.reject(error.message || error);
    }

    private url: string = 'https://hooks.slack.com/services/xxx/xxx/xxx';

    constructor(private http: Http) {}

    public slack(data: any): Observable<{}> {
        let body = JSON.stringify(data);
        let headers: Headers = new Headers();
        headers.append('Content-Type', 'application/json');

        let options = new RequestOptions({ headers: headers });

        return this.http.post(this.url, body, options)
            .map(this.extractData)
            .catch(this.handleError);
    }

}

我记得在 AngularJS 中遇到过这个问题,下面修复了它... angular 2+ 中的等价物是什么?

app.config(function ($httpProvider) {
  $httpProvider.defaults.headers.common = {};
  $httpProvider.defaults.headers.post = {};
  $httpProvider.defaults.headers.put = {};
  $httpProvider.defaults.headers.patch = {};
}); 

我见过Angular 2 Token: Response for preflight has invalid HTTP status code 400 这样的答案,但没有帮助

这在 PostMan 中有效

curl -X POST \
  https://hooks.slack.com/services/xx/xx/xx \
  -H 'content-type: application/x-www-form-urlencoded' \
  -d payload=%7B%0A%20%20%20%20%20%20%22channel%22%3A%20%22%23general%22%2C%0A%20%20%20%20%20%20%22username%22%3A%20%22webhookbot%22%2C%0A%20%20%20%20%20%20%22text%22%3A%20%22This%20is%20posted%20to%20%23general%20and%20comes%20from%20a%20bot%20named%20webhookbot.%22%2C%0A%20%20%20%20%20%20%22icon_emoji%22%3A%20%22%3Aghost%3A%22%0A%20%20%20%7D

【问题讨论】:

  • 也许可以查看 slacks api 文档以了解调用所需的标头。
  • @floor 我编辑了这个问题以包含一个关于现在工作的 sn-p

标签: javascript angular typescript http-headers


【解决方案1】:

看来你的payload必须是param而不是json 试试这个,如果你有 jQuery

import { Injectable } from '@angular/core';
import { Http, RequestOptions, Response, Headers } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
declare var $: any


@Injectable()
export class SlackService {
    extractData(res: Response) {
        let body = res.json();
        return body || {};
    }
    handleError (error: Response | any) {
        console.error(error.message || error);
        return Promise.reject(error.message || error);
    }

    private url: string = 'https://hooks.slack.com/services/xxx/xxx/xxx';

    constructor(private http: Http) {}

    public slack(data: any): Observable<{}> {
        let body = $.param(data);
        let headers: Headers = new Headers();
        headers.append('Content-Type', 'application/x-www-form-urlencoded');

        let options = new RequestOptions({ headers: headers });

        return this.http.post(this.url, body, options)
            .map(this.extractData)
            .catch(this.handleError);
    }

}

或者尽快尝试新的 HttpClient 旧的 htpp 库将被弃用,请参阅here

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders} from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';



@Injectable()
export class SlackService {

    handleError (error: Response | any) {
        console.error(error.message || error);
        return Promise.reject(error.message || error);
    }

    private url: string = 'https://hooks.slack.com/services/xxx/xxx/xxx';

    constructor(private http: HttpClient) {}

    public slack(data: any): Observable<{}> {
        const requestOptions = {
            params: new HttpParams()
        };
        //Add all your payload here
        requestOptions.params.set('foo', 'bar');


        return this.http.post(this.url, requestOptions , {
            headers: new HttpHeaders({ 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;' })
        })
       .map((res) => res.json())
       .catch(this.handleError);
    }

}

【讨论】:

  • 这不起作用...没有任何变化可以使我摆脱错误Response for preflight has invalid HTTP status code 400...
【解决方案2】:

对我来说,API 似乎缺少 CORS 配置(OPTIONS http 方法)。

如果来源不同,现代网络浏览器会首先请求 OPTIONS(飞行前)。

基本上,您需要做的是在后端配置 CORS - 前端与它无关。

更多关于CORS

【讨论】:

  • 我正在尝试从前端对 Slack 进行此调用...它适用于其他 webprojects。这是一个 Angular HTTP 模块任务。我一定很想念它的使用方式
【解决方案3】:

尝试更改以下代码行:

headers.append('Content-Type', 'application/json');

headers.set('Content-Type', 'application/x-www-form-urlencoded');

【讨论】:

  • 这不会改变结果
猜你喜欢
  • 2016-01-18
  • 2018-09-22
  • 2017-05-10
  • 2016-02-08
  • 2016-12-17
  • 2016-05-19
  • 2017-08-24
  • 2018-09-06
  • 1970-01-01
相关资源
最近更新 更多