向Angular HttpClient添加HTTP标头不发送标头,为什么?


179

这是我的代码:

import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';

logIn(username: string, password: string) {
    const url = 'http://server.com/index.php';
    const body = JSON.stringify({username: username,
                                 password: password});
    const headers = new HttpHeaders();
    headers.set('Content-Type', 'application/json; charset=utf-8');
    this.http.post(url, body, {headers: headers}).subscribe(
        (data) => {
            console.log(data);
        },
        (err: HttpErrorResponse) => {
            if (err.error instanceof Error) {
                console.log('Client-side error occured.');
            } else {
                console.log('Server-side error occured.');
            }
        }
    );
}

和这里的网络调试:

Request Method:POST
Status Code:200 OK
Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:46
Content-Type:text/plain

和数据存储在“请求有效负载”中,但在我的服务器中未收到POST值:

print_r($_POST);
Array
(
)

我相信错误来自于POST期间未设置的标头,我怎么做错了?


对了谢谢!但是在后端没有收到数据后,我去了application / x-www-form-urlencoded。但无论如何,主要问题是anserwerd
Frennetix

勾选此角8例的HTTPClient消费与自定义标题和错误处理REST风格的API freakyjolly.com/...
代码间谍

Answers:


307

HttpHeader类的实例是不可变的对象。调用类方法将返回一个新实例作为结果。因此,基本上,您需要执行以下操作:

let headers = new HttpHeaders();
headers = headers.set('Content-Type', 'application/json; charset=utf-8');

要么

const headers = new HttpHeaders({'Content-Type':'application/json; charset=utf-8'});

更新:添加多个标题

let headers = new HttpHeaders();
headers = headers.set('h1', 'v1').set('h2','v2');

要么

const headers = new HttpHeaders({'h1':'v1','h2':'v2'});

更新:接受HttpClient标头和参数的对象映射

由于5.0.0-beta.6现在可以跳过HttpHeaders对象的创建,因此可以直接传递对象映射作为参数。因此,现在可以执行以下操作:

http.get('someurl',{
   headers: {'header1':'value1','header2':'value2'}
});

50
有趣。因此,对于来自OO世界的我们来说,set方法名称有些误导。
tishma '17

3
如果要设置多个标题怎么办?我尝试链接注释,HttpHeaders().set(..).set(..)但是现在再次将标头写入HTTP标头字段中了吗?
displayname

根据srcgithub.com/angular/angular/blob/master/packages/common/http/src/…,它应该可以正常工作。如果没有您的问题(代码)的更多信息,我将无法为您提供进一步的帮助
Jota.Toledo

因此,在我的情况下,我通过将参数列表中的标头和参数切换到函数而犯了一个错误(因为两者都接受了json对象)。意思就是提防错误,毕竟,将HttpHeaders作为类型是一种好习惯。
危险89年

3
为什么标头和请求不可变?angular.io/guide/http#immutability
Drellgor '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.