Как передать URL-аргументы (строку запроса) в HTTP-запрос на Angular?

141
Привет, ребята, я создаю HTTP-запрос на Angular 2, но я не знаю, как добавить к нему аргументы 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.

  • 0
    stackoverflow.com/questions/26541801/… сослаться на это. Создайте URL перед вызовом и передайте его функции подписки вместо BASE_URL. 2cents
Теги:
angular
http

6 ответов

204
Лучший ответ

Метод 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 содержится более подробная информация. Здесь можно найти .

  • 0
    Спасибо за это, это помогло.
  • 0
    я скоро добавлю пример, или вы можете сделать это, если он уже работает. :)
Показать ещё 22 комментария
114

Изменить 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.search устарел. Вместо этого используйте requestOptions.params:

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())
...
  • 3
    Не работает для меня Я покопался в исходном коде и обнаружил, что второй параметр http.get ожидает интерфейс RequestOptionsArgs, который URLSearchParams не реализует. Обертывание searchParams внутри объекта RequestOptions работает. Было бы неплохо иметь ярлык, хотя.
  • 3
    Вы совершенно правы, я забыл RequestOptions . Я обновил свой ответ.
Показать ещё 3 комментария
17

Версия 4.3.x +

Используйте HttpParams, HttpClient из @angular/common/http

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

Помогите некоторым!

  • 1
    не работает для вложенных объектов: /
  • 0
    @BrunoPeres попробуйте структурировать ваш вложенный объект, используя JSON.stringify()
Показать ещё 1 комментарий
7

Мой пример

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
  • 0
    Это работает для меня на 4.4.5
4

Если вы планируете отправлять более одного параметра.

Компонент

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
      });
    });
});
  • 0
    В запросе get вашего сервиса мне не хватает того, как вы обрабатываете запрос get.
  • 0
    О, я думаю, вы бы поместили запрос http get в этом методе как ответ как ответ ethumsulan
-1
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.scripts в angular-cli.json

Ещё вопросы

Сообщество Overcoder
Наверх
Меню