[英]Angular 2 - Http Get request - pass json Object
我怎样才能做一个 http 获取请求并传递一个 json Object
这是我的 json 对象
{{firstname:"Peter", lastname:"Test"}
而这个 Object 我想传递 http 请求以获取匹配人员列表。
这怎么可能? 此示例仅显示一个简单的获取请求,结果为 json。 我该如何修改它?
//Component: person:Person; persons:Person []; .... //Whre can I pass the person, here in the service?? getMatchedPersons(){ this.httpService.getMatchedPersons().subscribe( data => this.persons = data, error => aller(error) ); ); //SERVICE //pass parameters?? how to send the person object here? getMatchedPersons(){ return this.http.get('url').map(res => res.json()); }
Http.get
方法将实现RequestOptionsArgs的对象作为第二个参数。
该对象的搜索字段可用于设置字符串或URLSearchParams对象。
一个例子:
// Parameters obj-
let params: URLSearchParams = new URLSearchParams();
params.set('firstname', yourFirstNameData);
params.set('lastname', yourLastNameData);
//Http request-
return this.http.get('url', {
search: params
}).subscribe(
(response) => //some manipulation with response
);
您必须将 json 序列化为参数列表:
?firstname=peter&lastname=test
并将其附加到 URL 中,因为GET
请求没有正文。
有几种方法可以将 JSON 转换为 QueryParameters。 他们在这个问题中得到解决: 是否有任何本机函数可以将 json 转换为 url 参数?
在那里你可以选择你喜欢的毒药,我的是:
function obj_to_query(obj) {
var parts = [];
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]));
}
}
return "?" + parts.join('&');
}
但请注意, GET
请求必须遵守基于此答案的 URL 限制,建议保持在2000 个字符以下以确保安全:
RFC 说 8000
IE8 和 IE9 最高可达 2083
搜索引擎只能读取到 2048
用一个普通的JSON转换为一个参数可以使用的相同的方法URLSearchParams
通过РомаСкидан的建议:
let params: URLSearchParams = objToSearchParams(obj);
return this.http.get('url', {
search: params
}).subscribe(
(response) => //some manipulation with response
);
function objToSearchParams(obj): URLSearchParams{
let params: URLSearchParams = new URLSearchParams();
for (var key in obj) {
if (obj.hasOwnProperty(key))
params.set(key, obj[key]);
}
return params;
}
也许您想对 json 对象进行字符串化
var json = JSON.stringify(myObj);
this.http.get('url'+'?myobj='+encodeURIComponent(json))
使用POST
请求将对象传递给服务器:
//SERVICE
getMatchedPersons(searchObj: any){
return this.http.post('url', JSON.stringify(searchObj))
.map(res => res.json());
}
然后你可以传递任何你想要的 JS 对象并将它发送到你的 http 请求中的服务器。
getMatchedPersons(searchObj: any){
this.httpService.getMatchedPersons(searchObj: any).subscribe(
data => this.persons = data,
error => alert(error);
);
);
类似于 AngJobs 的,但也许更新了?? 不需要调用encodeURIComponent
。 这是角度:
const stringifiedParams = JSON.stringify(this.filterParams);
return this.http.get<any[]>(`persons`, {params: {filter: stringifiedParams}});
在服务器节点上,使用JSON.parse
反序列化参数:
filter = JSON.parse(req.query.filter.toString());
实际上有一种更简单的方法来刷新参数
getMatchedPersons(myObject: any): Observable<Person[]> {
return this.http.get<Person[]>('url', { params: { ...myObject } });
}
上面的代码表示一个 function 接受一个JSON
object myObject
作为参数。
HttpClient.get
方法接受一个options
参数作为它的第二个参数。
options
参数包含许多有用的键,但在我们的例子中我们只对params
键感兴趣。
params
的值是{...myObject }
,也就是说,我们使用扩展运算符传递 object 中的所有key:value
对。
请参阅这将完成工作,并且不会使 URL 看起来很难看?
和key=value
和&
字符,当然在任何一种情况下都不会向用户显示这些参数,因为它只是一个HTTP
调用,但是,如果有人使用记录器interceptor
,他们将有一个干净的日志。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.