我想从一个Angular组件触发HTTP请求,但我不知道如何向它添加URL参数(查询字符串)。
this.http.get(StaticSettings.BASE_URL).subscribe(
(response) => this.onGetForecastResult(response.json()),
(error) => this.onGetForecastError(error.json()),
() => this.onGetForecastComplete()
)
现在是我的静态设置。BASE_URL就像一个没有查询字符串的URL: http://atsomeplace.com/,但我想让它像http://atsomeplace.com/?var1=val1&var2=val2
如何添加var1,和var2到我的HTTP请求对象作为对象?
{
query: {
var1: val1,
var2: val2
}
}
然后只有HTTP模块将其解析为URL查询字符串。
如果您计划发送多个参数。
组件
private options = {
sort: '-id',
select: null,
limit: 1000,
skip: 0,
from: null,
to: null
};
constructor(private service: Service) { }
ngOnInit() {
this.service.getAllItems(this.options)
.subscribe((item: Item[]) => {
this.item = item;
});
}
服务
private options = new RequestOptions({headers: new Headers({'Content-Type': 'application/json'})});
constructor(private http: Http) { }
getAllItems(query: any) {
let params: URLSearchParams = new URLSearchParams();
for(let key in query){
params.set(key.toString(), query[key]);
}
this.options.search = params;
this.header = this.headers();
继续你的http请求,就像@ethemsulan做的那样。
服务器端路由
router.get('/api/items', (req, res) => {
let q = {};
let skip = req.query.skip;
let limit = req.query.limit;
let sort = req.query.sort;
q.from = req.query.from;
q.to = req.query.to;
Items.find(q)
.skip(skip)
.limit(limit)
.sort(sort)
.exec((err, items) => {
if(err) {
return res.status(500).json({
title: "An error occurred",
error: err
});
}
res.status(200).json({
message: "Success",
obj: items
});
});
});
编辑Angular >= 4.3.x
HttpClient是和HttpParams一起引入的。下面是一个使用示例:
import { HttpParams, HttpClient } from '@angular/common/http';
constructor(private http: HttpClient) { }
let params = new HttpParams();
params = params.append('var1', val1);
params = params.append('var2', val2);
this.http.get(StaticSettings.BASE_URL, {params: params}).subscribe(...);
(老答案)
编辑Angular >= 4.x
requestOptions。搜索已弃用。requestOptions使用。改为参数:
let requestOptions = new RequestOptions();
requestOptions.params = params;
原始答案(Angular 2)
您需要导入URLSearchParams,如下所示
import { Http, RequestOptions, URLSearchParams } from '@angular/http';
然后构建参数并像下面这样进行http请求:
let params: URLSearchParams = new URLSearchParams();
params.set('var1', val1);
params.set('var2', val2);
let requestOptions = new RequestOptions();
requestOptions.search = params;
this.http.get(StaticSettings.BASE_URL, requestOptions)
.toPromise()
.then(response => response.json())
...
版本5 +
在Angular 5及更高版本中,你不必使用HttpParams。您可以直接发送json对象,如下所示。
let data = {limit: "2"};
this.httpClient.get<any>(apiUrl, {params: data});
请注意,数据值应该是字符串,即;{params: {limit: "2"}}
版本4.3.x +
使用@angular/common/http中的HttpParams、HttpClient
import { HttpParams, HttpClient } from '@angular/common/http';
...
constructor(private httpClient: HttpClient) { ... }
...
let params = new HttpParams();
params = params.append("page", 1);
....
this.httpClient.get<any>(apiUrl, {params: params});
另外,尝试使用JSON.stringify()对嵌套对象进行字符串化。
如果您计划发送多个参数。
组件
private options = {
sort: '-id',
select: null,
limit: 1000,
skip: 0,
from: null,
to: null
};
constructor(private service: Service) { }
ngOnInit() {
this.service.getAllItems(this.options)
.subscribe((item: Item[]) => {
this.item = item;
});
}
服务
private options = new RequestOptions({headers: new Headers({'Content-Type': 'application/json'})});
constructor(private http: Http) { }
getAllItems(query: any) {
let params: URLSearchParams = new URLSearchParams();
for(let key in query){
params.set(key.toString(), query[key]);
}
this.options.search = params;
this.header = this.headers();
继续你的http请求,就像@ethemsulan做的那样。
服务器端路由
router.get('/api/items', (req, res) => {
let q = {};
let skip = req.query.skip;
let limit = req.query.limit;
let sort = req.query.sort;
q.from = req.query.from;
q.to = req.query.to;
Items.find(q)
.skip(skip)
.limit(limit)
.sort(sort)
.exec((err, items) => {
if(err) {
return res.status(500).json({
title: "An error occurred",
error: err
});
}
res.status(200).json({
message: "Success",
obj: items
});
});
});