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期间未设置标头引起的,我该怎么做错了?
#1 楼
新的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'});
Update:接受HttpClient标头和参数的对象映射
由于5.0.0-beta.6现在可以跳过
HttpHeaders
对象的创建,而直接将对象映射作为参数传递。因此,现在可以执行以下操作:http.get('someurl',{
headers: {'header1':'value1','header2':'value2'}
});
评论
有趣。因此,对于来自OO世界的我们来说,设置方法名称有些误导。
– tishma
17年9月30日在9:45
如果要设置多个标题怎么办?我尝试链接注释HttpHeaders()。set(..)。set(..),但是现在再次将标头写入HTTP标头字段了吗?
– Stefan Falk
17年11月2日,19:50
根据srcgithub.com/angular/angular/blob/master/packages/common/http/src/…,它应该可以正常工作。如果没有有关您的问题(代码)的更多信息,我无法为您提供更多帮助
–乔塔·托莱多
17年11月2日在20:09
因此,在我的情况下,我通过将参数列表中的标头和参数切换到函数而犯了一个错误(因为两者都接受了json对象)。意思就是要提防错误,毕竟将HttpHeaders作为类型是一种好习惯。非主题:当您可以在任何地方使用对象时,请不要使用TypeScript,而要使用VanillaJS。
–danger89
18年4月26日在0:00
为什么标头和请求不可变? angular.io/guide/http#immutability
– Drellgor
18年5月23日在23:51
#2 楼
要添加多个参数或标头,您可以执行以下操作: constructor(private _http: HttpClient) {}
//....
const url = `${environment.APP_API}/api/request`;
let headers = new HttpHeaders().set('header1', hvalue1); // create header object
headers = headers.append('header2', hvalue2); // add a new header, creating a new object
headers = headers.append('header3', hvalue3); // add another header
let params = new HttpParams().set('param1', value1); // create params object
params = params.append('param2', value2); // add a new param, creating a new object
params = params.append('param3', value3); // add another param
return this._http.get<any[]>(url, { headers: headers, params: params })
评论
此方法似乎也不起作用。我的意思是,您可以添加标头,它们将显示在lazyUpdate属性中,但最终通过订阅使请求生效时,它将因CreateListFromArrayLike异常而崩溃。
–加戈
17年11月14日在16:18
要添加多个标头,请使用:headers:HttpHeaders = new HttpHeaders({'Application-Id':this.appId,“ REST-API-Key”:this.apiKey,“ Content-Type”:“ application / json”});
–本森
17-12-12在20:49
#3 楼
在您的http请求中设置如下的http标头return this.http.get(url, { headers: new HttpHeaders({'Authorization': 'Bearer ' + token})
});
#4 楼
我为此苦了很长时间。我正在使用Angular 6,发现let headers = new HttpHeaders();
headers = headers.append('key', 'value');
不起作用。但是真正起作用的是
let headers = new HttpHeaders().append('key', 'value');
,当您意识到它们是不可变的时,这是有道理的。因此,创建标头后,您将无法添加标头。我没有尝试过,但我怀疑
let headers = new HttpHeaders();
let headers1 = headers.append('key', 'value');
也可以工作。
评论
您的第一次尝试应该可以成功,您正在将附加结果分配给headers变量。现在,您的解释没有任何意义,尤其是您最后一次猜测,添加一个let可能会解决它
–胡安·门德斯(Juan Mendes)
18年11月14日在12:45
#5 楼
我当时使用的是Angular 8,唯一对我有用的是: getCustomHeaders(): HttpHeaders {
const headers = new HttpHeaders()
.set('Content-Type', 'application/json')
.set('Api-Key', 'xxx');
return headers;
}
#6 楼
在手册(https://angular.io/guide/http)中,我读到了:HttpHeaders类是不可变的,因此每个set()返回一个新实例并应用更改。
以下代码对我来说适合angular-4:
return this.http.get(url, {headers: new HttpHeaders().set('UserEmail', email ) });
#7 楼
首先,您需要添加带有HttpClient的HttpHeadersimport { HttpClient,HttpHeaders } from '@angular/common/http';
您的构造函数应该像这样。
constructor(private http: HttpClient) { }
然后您可以像这样使用
let header = new HttpHeaders({ "Authorization": "Bearer "+token});
const requestOptions = { headers: header};
return this.http.get<any>(url, requestOptions)
.toPromise()
.then(data=> {
//...
return data;
});
#8 楼
在我的遗留应用程序中,原型js的Array.from与angular的Array.from冲突,导致了这个问题。我通过保存angular的Array.from版本并在原型加载后重新分配它来解决它。#9 楼
具有错误处理和自定义标题的Angular 8 HttpClient服务示例 import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
import { Student } from '../model/student';
import { Observable, throwError } from 'rxjs';
import { retry, catchError } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class ApiService {
// API path
base_path = 'http://localhost:3000/students';
constructor(private http: HttpClient) { }
// Http Options
httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json'
})
}
// Handle API errors
handleError(error: HttpErrorResponse) {
if (error.error instanceof ErrorEvent) {
// A client-side or network error occurred. Handle it accordingly.
console.error('An error occurred:', error.error.message);
} else {
// The backend returned an unsuccessful response code.
// The response body may contain clues as to what went wrong,
console.error(
`Backend returned code ${error.status}, ` +
`body was: ${error.error}`);
}
// return an observable with a user-facing error message
return throwError(
'Something bad happened; please try again later.');
};
// Create a new item
createItem(item): Observable<Student> {
return this.http
.post<Student>(this.base_path, JSON.stringify(item), this.httpOptions)
.pipe(
retry(2),
catchError(this.handleError)
)
}
....
....
在此处查看完整的示例教程
评论
是我还是对这个问题有点过头了?
– Ojonugwa Jude Ochalifu
19年8月16日在14:31
这不是试图回答OP的问题。它只是一堆代码,没有任何解释。
–乔塔·托莱多
19年8月30日在17:04
这甚至与上下文无关。看起来像是自我提升。
– Aakash Kumar
9月16日21:12
评论
是啊谢谢!但是在后端没有收到数据后,我去了application / x-www-form-urlencoded。无论如何,主要问题是anserwerd查看此Angular 8 HTTPClient示例,以使用具有自定义标头和错误处理的RESTFul APIfreakyjolly.com/…