Come passare argomenti url (stringa di query) a una richiesta HTTP su Angular?


266

Sto creando una richiesta HTTP su Angular, ma non so come aggiungere argomenti url (stringa di query).

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

Ora il mio StaticSettings.BASE_URL è qualcosa come un url senza stringa di query come: http://atsomeplace.com/ ma voglio che sia http://atsomeplace.com/?var1=val1&var2=val2

Dove var1 e var2 si adattano al mio oggetto richiesta Http? Voglio aggiungerli come un oggetto.

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

e quindi solo il modulo Http fa il lavoro per analizzarlo nella stringa di query URL.


stackoverflow.com/questions/26541801/… fare riferimento a questo. Crea l'URL prima di chiamare e passalo alla funzione di iscrizione al posto di BASE_URL. 2 centesimi
pratikpawar,

Risposte:


330

I metodi HttpClient ti consentono di impostare i parametri nelle sue opzioni.

È possibile configurarlo importando HttpClientModule dal pacchetto @ angular / common / http.

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

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

Successivamente è possibile iniettare HttpClient e utilizzarlo per eseguire la richiesta.

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

Per le versioni angolari precedenti alla versione 4 puoi fare lo stesso usando il servizio Http .

Il metodo Http.get accetta un oggetto che implementa RequestOptionsArgs come secondo parametro.

Il campo di ricerca di quell'oggetto può essere utilizzato per impostare una stringa o un oggetto URLSearchParams .

Un esempio:

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

La documentazione per la classe Http ha maggiori dettagli. Può essere trovato qui e un esempio funzionante qui .


2
A gist: gist.github.com/MiguelLattuada/bb502d84854ad9fc26e0 come utilizzare l'oggetto URLSearchParams, grazie ancora @toskv
Miguel Lattuada il

1
Super lisci con URLSearchParams! Risolto il mio problema con la serializzazione dell'oggetto JSON.
Logan H,

2
@SukumarMS non c'è davvero bisogno di qualcosa di speciale poiché fa parte del percorso. Basta concatenare le stringhe 'blabla.com/page/' + page + '/ activeFilter' + activeFilter. O se vuoi usare i letterali dei template `blabla.com/page / $ {page} / $ {activeFilter}`.
Toskv,

10
questo funziona per me:http.get(url, {params: {var1: val1, var2: val2}})
Alexander Suvorov,

8
searchla proprietà è stata privata da 4.0.0 -> usa paramsinvece
BotanMan il

180

Modifica angolare> = 4.3.x

HttpClient è stato introdotto insieme a HttpParams . Di seguito un esempio di utilizzo:

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

(Vecchie risposte)

Modifica angolare> = 4.x

requestOptions.searchè stato deprecato. Usa requestOptions.paramsinvece:

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

Risposta originale (Angolare 2)

Devi importare URLSearchParamscome di seguito

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

Quindi crea i tuoi parametri ed effettua la richiesta http come segue:

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
Non funziona per me. Ho scavato nel codice sorgente e ho scoperto che il secondo parametro di http.get prevede un'interfaccia RequestOptionsArgs, che URLSearchParams non implementa. Il wrapping di searchParams all'interno di un oggetto RequestOptions funziona. Sarebbe bello avere una scorciatoia però.
difficile da impostare il

3
Hai perfettamente ragione, ho dimenticato RequestOptions. Ho aggiornato la mia risposta.
Radouane ROUFID,

1
Grazie per aver segnalato la deprecazione di search. Risolto il mio problema
Hayden Braxton

Grazie per aver segnalato questo cambiamento! Tutti i documenti e i problemi che ho riscontrato per ore mi hanno detto di allegare i parametri alla searchproprietà.
Rayepps,

63

Versione 5+

Con Angular 5 e versioni successive, NON è necessario utilizzare HttpParams . Puoi inviare direttamente il tuo oggetto json come mostrato di seguito.

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

Si noti che i valori dei dati devono essere stringa, ovvero; { params: {limit: "2"}}

Versione 4.3.x +

Usa HttpParams, HttpClient da @ 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});

Potrebbe aiutare alcuni!


@BrunoPeres prova a stringere il tuo oggetto nidificato usandoJSON.stringify()
Rahmathullah M

1
@RahmathullahM - bichu, THX :)
Jamsheer

12

Angolare 6

È possibile passare i parametri necessari per ottenere la chiamata utilizzando i parametri:

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

dove x = {proprietà: "123"}.

Per quanto riguarda la funzione API che registra "123":

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

2
Questa è stata una modifica aggiunta nella versione 5. Già aggiunto qui stackoverflow.com/a/45455904/3276721
Miguel Lattuada,

9

Il mio esempio

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

Il mio metodo

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

nel mio componente

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

Dal postino

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

6

Nell'ultima versione di Angular 7/8, è possibile utilizzare l'approccio più semplice: -

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

Questo non funzionerà se nessuna delle searchParams"proprietà" non sono stringvalori.
Yulian,

5

Se prevedi di inviare più di un parametro.

Componente

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

Servizio

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

E continua con la tua richiesta http proprio come ha fatto @ethemsulan.

Percorso lato server

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

Nella richiesta get sul tuo servizio mi manca il modo in cui gestisci la richiesta get.
Winnemucca,

Oh, suppongo che inseriresti la richiesta get http in quel metodo come ritorno come la risposta di
ethumsulan

2

È possibile utilizzare HttpParams da @ angular / common / http e passare una stringa con la query. Per esempio:

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

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

Ora nel tuo codice

this.http.get(urlFull, options);

E questo funziona per te :)

Hoppe aiutarti


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

purché tu abbia installato jQuery , lo faccio npm i jquery --savee includo apps.scriptsinangular-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);

0

È possibile utilizzare i parametri URL dalla documentazione ufficiale.

Esempio: this.httpClient.get(this.API, { params: new HttpParams().set('noCover', noCover) })

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.