如何将url参数(查询字符串)传递给Angular上的HTTP请求?


265

我正在Angular上创建一个HTTP请求,但我不知道如何向其添加url参数(查询字符串)。

this.http.get(StaticSettings.BASE_URL).subscribe(
  (response) => this.onGetForecastResult(response.json()),
  (error) => this.onGetForecastError(error.json()),
  () => this.onGetForecastComplete()
);

现在,我的StaticSettings.BASE_URL类似于没有查询字符串的url,例如:http ://atsomeplace.com/,但我希望它成为http://atsomeplace.com/?var1=val1&var2=val2

哪里var1和var2适合我的Http请求对象?我想像一个对象一样添加它们。

{
  query: {
    var1: val1,
    var2: val2
  }
}

然后只有Http模块完成将其解析为URL查询字符串的工作。


stackoverflow.com/questions/26541801/…请参阅此。在调用之前创建URL,并将其传递给SUB_URL的订阅功能。2cents
pratikpawar 2015年

Answers:


329

HttpClient的方法允许您设置PARAMS在它的选项。

您可以通过从@ angular / common / http包导入HttpClientModule来配置它。

import {HttpClientModule} from '@angular/common/http';

@NgModule({
  imports: [ BrowserModule, HttpClientModule ],
  declarations: [ App ],
  bootstrap: [ App ]
})
export class AppModule {}

之后,您可以注入HttpClient并使用它来执行请求。

import {HttpClient} from '@angular/common/http'

@Component({
  selector: 'my-app',
  template: `
    <div>
      <h2>Hello {{name}}</h2>
    </div>
  `,
})
export class App {
  name:string;
  constructor(private httpClient: HttpClient) {
    this.httpClient.get('/url', {
      params: {
        appid: 'id1234',
        cnt: '5'
      },
      observe: 'response'
    })
    .toPromise()
    .then(response => {
      console.log(response);
    })
    .catch(console.log);
  }
}

对于版本4之前的角度版本,您可以使用Http服务执行相同的操作。

Http.get方法接受一个对象,该器具RequestOptionsArgs作为第二参数。

该对象的搜索字段可用于设置字符串或URLSearchParams对象。

一个例子:

 // Parameters obj-
 let params: URLSearchParams = new URLSearchParams();
 params.set('appid', StaticSettings.API_KEY);
 params.set('cnt', days.toString());

 //Http request-
 return this.http.get(StaticSettings.BASE_URL, {
   search: params
 }).subscribe(
   (response) => this.onGetForecastResult(response.json()), 
   (error) => this.onGetForecastError(error.json()), 
   () => this.onGetForecastComplete()
 );

Http类的文档具有更多详细信息。它可以发现这里和工作的例子在这里



1
URLSearchParams非常漂亮!解决了序列化JSON对象的问题。
Logan H

2
@SukumarMS确实不需要任何特殊的东西,因为它是路径的一部分。只需将字符串blabla.com/page/'+ page +'/ activeFilter'+ activeFilter串联即可。或者,如果您要使用模板文字blabla.com/page / $ {page} / $ {activeFilter}`。
toskv '17

10
这对我http.get(url, {params: {var1: val1, var2: val2}})
有用

8
search物业已经从4.0.0 depricated - >使用params代替
BotanMan

180

编辑角度> = 4.3.x

HttpClientHttpParams一起引入。下面是一个使用示例:

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(...);

(旧答案)

编辑角度> = 4.x

requestOptions.search已不推荐使用。requestOptions.params改为使用:

let requestOptions = new RequestOptions();
requestOptions.params = params;

原始答案(角度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())
...

3
不为我工作。我深入研究了源代码,发现http.get的第二个参数需要一个RequestOptionsArgs接口,而URLSearchParams没有实现该接口。将searchParams包装在RequestOptions对象内是可行的。有一个捷径虽然会很好。
硬性设置

3
你完全正确,我忘了RequestOptions。我更新了答案。
Radouane ROUFID

1
感谢您指出不赞成使用search。固定我的概率
海登·布拉克斯顿

感谢您指出此更改!我几个小时发现的所有文档和问题都告诉我将参数附加到search属性。
rayepps

63

版本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});

可能会帮助一些!


@BrunoPeres尝试使用JSON.stringify()
Rahmathullah M,

1
@RahmathullahM-bichu,THX :)
Jamsheer


9

我的例子

private options = new RequestOptions({headers: new Headers({'Content-Type': 'application/json'})});

我的方法

  getUserByName(name: string): Observable<MyObject[]> {
    //set request params
    let params: URLSearchParams = new URLSearchParams();
    params.set("name", name);
    //params.set("surname", surname); for more params
    this.options.search = params;

    let url = "http://localhost:8080/test/user/";
    console.log("url: ", url);

    return this.http.get(url, this.options)
      .map((resp: Response) => resp.json() as MyObject[])
      .catch(this.handleError);
  }

  private handleError(err) {
    console.log(err);
    return Observable.throw(err || 'Server error');
  }

在我的组件中

  userList: User[] = [];
  this.userService.getUserByName(this.userName).subscribe(users => {
      this.userList = users;
    });

邮递员

http://localhost:8080/test/user/?name=Ethem

6

在最新的Angular 7/8中,您可以使用最简单的方法:

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

getDetails(searchParams) {
    const httpOptions = {
        headers: { 'Content-Type': 'application/json' },
        params: { ...searchParams}
    };
    return this.http.get(this.Url, httpOptions);
}

如果任何一个searchParams属性都不是string值,则此方法将无效。
浴帘

5

如果您打算发送多个参数。

零件

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
      });
    });
});

在您对服务的获取请求中,我缺少您如何处理获取请求。
Winnemucca '10

哦,我想您会将Http get请求放入该方法中,就像ethumsulan的答案一样返回
mjwrazor

2

您可以使用@ angular / common / http中的HttpParams并在查询中传递一个字符串。例如:

import { HttpClient, HttpParams } from '@angular/common/http';
const query = 'key=value' // date=2020-03-06

const options = {
  params: new HttpParams({
    fromString: query
  })
}

现在在您的代码中

this.http.get(urlFull, options);

这对你有用:)

我希望能帮到你


0
import ...
declare var $:any;
...
getSomeEndPoint(params:any): Observable<any[]> {
    var qStr = $.param(params); //<---YOUR GUY
    return this._http.get(this._adUrl+"?"+qStr)
      .map((response: Response) => <any[]> response.json())
      .catch(this.handleError);
}

前提是您已经安装了jQuery,我这样做npm i jquery --save并包含apps.scriptsangular-cli.json


0
import { Http, Response } from '@angular/http';
constructor(private _http: Http, private router: Router) {
}

return this._http.get('http://url/login/' + email + '/' + password)
       .map((res: Response) => {
           return res.json();
        }).catch(this._handleError);

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.