URL argümanlarını (sorgu dizesi) Angular'daki bir HTTP isteğine nasıl iletirim?


265

Açısal üzerinde bir HTTP isteği oluşturuyorum, ancak URL argümanlarını (sorgu dizesi) nasıl ekleyeceğimi bilmiyorum.

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

Şimdi benim StaticSettings.BASE_URL hiçbir sorgu dizesi gibi bir url gibi bir şey: http://atsomeplace.com/ ama olmak istiyorum http://atsomeplace.com/?var1=val1&var2=val2

Var1 ve var2, Http istek nesnesime nerede uyuyor? Onları bir nesne gibi eklemek istiyorum.

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

ve sonra sadece Http modülü işi URL sorgu dizesine ayrıştırmak için yapar.


stackoverflow.com/questions/26541801/… buna bakın. Aramadan önce URL oluşturun ve BASE_URL yerine abone olma işlevine iletin. 2cents
pratikpawar

Yanıtlar:


329

HttpClient yöntemleri ayarlamak için izin params 's seçeneklerinde.

@ Angular / common / http paketinden HttpClientModule dosyasını içe aktararak yapılandırabilirsiniz .

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

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

Bundan sonra HttpClient'i enjekte edebilir ve isteği yapmak için kullanabilirsiniz.

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

Sürüm 4'ten önceki açısal sürümler için aynı işlemi Http hizmetini kullanarak da yapabilirsiniz .

Http.get yöntem uygulayan bir nesne alır RequestOptionsArgs ikinci bir parametre olarak.

Bu nesnenin arama alanı, bir dize veya bir URLSearchParams nesnesi ayarlamak için kullanılabilir .

Bir örnek:

 // 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 sınıfının belgeleri daha fazla ayrıntı içerir. Bu bulunabilir burada ve bir çalışma örneği burada .


2
Bir öz : gist.github.com/MiguelLattuada/bb502d84854ad9fc26e0 URLSearchParams nesnesinin nasıl kullanılacağı, tekrar teşekkürler @toskv
Miguel Lattuada

1
URLSearchParams ile süper şık! JSON nesnesini serileştirme sorunumu çözdü.
Logan H

2
@SukumarMS Yolun bir parçası olduğu için özel bir şeye gerçekten gerek yok. 'Blabla.com/page/' + page + '/ activeFilter' + activeFilter dizelerini birleştirmeniz yeterlidir. Veya `` blabla.com/page / $ {page} / $ {activeFilter} 'şablon değişmezlerini kullanmak istiyorsanız.
toskv

10
bu benim için çalışıyor:http.get(url, {params: {var1: val1, var2: val2}})
Alexander Suvorov

8
searchmülkiyet 4.0.0 -> kullanım paramsyerine
sınırlandırılmış

180

Açıyı Düzenle> = 4.3.x

HttpClient , HttpParams ile birlikte tanıtıldı . Aşağıda bir kullanım örneği verilmiştir:

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

(Eski cevaplar)

Açıyı Düzenle> = 4.x

requestOptions.search, kullanımdan kaldırıldı. requestOptions.paramsBunun yerine kullanın :

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

Orijinal cevap (Açısal 2)

URLSearchParamsAşağıdaki gibi içe aktarmanız gerekir

import { Http, RequestOptions, URLSearchParams } from '@angular/http';

Ardından parametrelerinizi oluşturun ve http isteğini aşağıdaki gibi yapın:

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
Benim için çalışmıyor. Kaynak kodunu araştırdım ve http.get öğesinin ikinci parametresinin URLSearchParams'ın uygulamadığı bir RequestOptionsArgs arabirimi beklediğini buldum. SearchParams öğesini bir RequestOptions nesnesinin içine sarmak çalışır. Yine de bir kısayol olması güzel olurdu.
hardsetting

3
Tamamen haklısın, unuttum RequestOptions. Cevabımı güncelledim.
Radouane ROUFID

1
Kullanımdan kaldırıldığını belirttiğiniz için teşekkür ederiz search. Benim prob düzeltildi
Hayden Braxton

Bu değişikliği gösterdiğin için teşekkürler! Saatlerdir bulduğum tüm dokümanlar ve sorunlar bana searchmülke param takmamı söylüyor .
rayepps

63

Sürüm 5+

Açısal 5 ve üstü ile HttpParams'ı kullanmanız GEREKMEZ . Json nesnenizi aşağıda gösterildiği gibi doğrudan gönderebilirsiniz.

let data = {limit: "2"};
this.httpClient.get<any>(apiUrl, {params: data});

Veri değerlerinin dize olması gerektiğini lütfen unutmayın; { params: {limit: "2"}}

Sürüm 4.3.x +

Kullanım HttpParams, HttpClient gelen @ açısal / ortak / 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});

Biraz yardım edebilir!


@BrunoPeres iç içe geçmiş nesneyi kullanarak telize etmeyi deneyinJSON.stringify()
Rahmathullah M

1
@RahmathullahM - Bichu, THX :)
Jamsheer

12

Açısal 6

Params kullanarak çağrı almak için gerekli parametreleri iletebilirsiniz:

this.httpClient.get<any>(url, { params: x });

burada x = {özellik: "123"}.

"123" kaydeden api fonksiyonuna gelince:

router.get('/example', (req, res) => {
    console.log(req.query.property);
})

2
Bu, sürüm 5'te eklenen bir değişiklikti. Zaten buraya eklendi stackoverflow.com/a/45455904/3276721
Miguel Lattuada

9

Örneğim

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

Benim yöntemim

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

bileşenimde

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

Postacı tarafından

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

6

En son Açısal 7/8, en basit yaklaşımı kullanabilirsiniz: -

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'Özelliklerinden herhangi biri stringdeğer değilse bu çalışmaz .
Yulian

5

Birden fazla parametre göndermeyi planlıyorsanız.

Bileşen

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

Hizmet

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

Ve @ethemsulan'ın yaptığı gibi http isteğinize devam edin.

Sunucu tarafı yolu

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

Hizmetinizdeki alma isteğinde, alma isteğini nasıl ele aldığınızı kaçırıyorum.
Winnemucca

Oh sanırım ethumsulan'ın cevabı gibi bir dönüş olarak bu yöntemde http olsun isteği koyarsınız
mjwrazor

2

@ Angular / common / http adresinden HttpParams'ı kullanabilir ve sorguyla bir dize geçirebilirsiniz. Örneğin:

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

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

Şimdi kodunuzda

this.http.get(urlFull, options);

Ve bu sizin için çalışıyor :)

Sana yardım ediyorum


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

Eğer kaydıyla jQuery yüklü yapmam npm i jquery --saveve dahil apps.scriptsiçindeangular-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);

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.