Angular 2 - Http获取请求 - 传递json对象

ham*_*ras 14 javascript http angular

如何进行http get请求并传递json对象

这是我的json-Object

{{firstname:"Peter", lastname:"Test"}
Run Code Online (Sandbox Code Playgroud)

这个对象我想传递http请求以获得匹配人员列表.

这怎么可能?此示例仅显示带有json结果的简单get请求.我该如何修改它?

//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());
  }
Run Code Online (Sandbox Code Playgroud)

Rom*_*dan 5

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 
 );
Run Code Online (Sandbox Code Playgroud)

  • 我简直不敢相信他们把一件应该非常简单的事情变得多么复杂:(而且不仅是有必要的角度,而且在需要通过 get 请求发送变量时,通常还有 javascript。如果我们有 20 个值,那么呢?我们必须遍历我们的对象并手动执行 params.set(key, value)?我不敢相信......我们应该能够告诉它“看,这是这个对象(或字符串化版本)。拆分它但是,您需要将其发送到 get 变量中)”,这就是全部。为什么他们把事情弄得这么复杂:( (11认同)

Spa*_*arK 5

对于纯javascript:

您必须将json序列化为参数列表:

?firstname=peter&lastname=test
Run Code Online (Sandbox Code Playgroud)

并将其附加到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('&');
}
Run Code Online (Sandbox Code Playgroud)

但请注意,GET请求必须遵守基于此答案的URL限制,建议保持在2000字以下才能安全:

RFC表示8000
IE8和IE9最高可达2083个
搜索引擎仅读到2048

使用Angular2 URLSearchParams

使用相同的方法将普通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;
 }
Run Code Online (Sandbox Code Playgroud)


rin*_*usu 0

使用POST请求将对象传递到服务器:

//SERVICE
getMatchedPersons(searchObj: any){
    return this.http.post('url', JSON.stringify(searchObj))
                    .map(res => res.json());
}
Run Code Online (Sandbox Code Playgroud)

然后你可以传递任何你想要的 JS 对象并将其在你的 http 请求中发送到服务器。

getMatchedPersons(searchObj: any){
    this.httpService.getMatchedPersons(searchObj: any).subscribe(
        data =>  this.persons = data,
        error => alert(error);
    );
); 
Run Code Online (Sandbox Code Playgroud)

  • @rinukkusu 我同意你的观点,REST 并不完美,但我同意 AngJobs 的观点,即对象获取和其他不改变服务器上内容的请求应该是可重播的,因此使用 get。如果该对象只是一个搜索过滤器并且您使用 post 来实现这一点,那么您会认为 google 做错了...... (3认同)