Wie übergebe ich URL-Argumente (Abfragezeichenfolge) an eine HTTP-Anforderung in Angular?

265

Ich erstelle eine HTTP-Anforderung für Angular, weiß jedoch nicht, wie ich URL-Argumente (Abfragezeichenfolge) hinzufügen soll.

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

Jetzt ist meine StaticSettings.BASE_URL so etwas wie eine URL ohne Abfragezeichenfolge wie: http://atsomeplace.com/, aber ich möchte, dass es http://atsomeplace.com/?var1=val1&var2=val2 ist

Wo passen var1 und var2 auf mein HTTP-Anforderungsobjekt? Ich möchte sie wie ein Objekt hinzufügen.

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

und dann erledigt nur das HTTP-Modul die Aufgabe, es in eine URL-Abfragezeichenfolge zu analysieren.

Miguel Lattuada
quelle
stackoverflow.com/questions/26541801/… verweisen Sie darauf. Erstellen Sie vor dem Aufruf eine URL und übergeben Sie diese anstelle von BASE_URL an die Abonnementfunktion. 2 Cent
Pratikpawar

Antworten:

329

Mit den HttpClient- Methoden können Sie die Parameter in den Optionen festlegen .

Sie können es konfigurieren, indem Sie das HttpClientModule aus dem Paket @ angle / common / http importieren .

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

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

Danach können Sie den HttpClient injizieren und ihn zur Ausführung der Anforderung verwenden.

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

Für Winkelversionen vor Version 4 können Sie dasselbe mit dem HTTP- Dienst tun .

Die Http.get- Methode verwendet ein Objekt, das RequestOptionsArgs als zweiten Parameter implementiert .

Das Suchfeld dieses Objekts kann zum Festlegen einer Zeichenfolge oder eines URLSearchParams- Objekts verwendet werden.

Ein Beispiel:

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

Die Dokumentation für die HTTP- Klasse enthält weitere Details. Es finden Sie hier und ein Arbeitsbeispiel hier .

toskv
quelle
2
Ein Kern: gist.github.com/MiguelLattuada/bb502d84854ad9fc26e0 wie man das URLSearchParams-Objekt verwendet, nochmals vielen Dank @toskv
Miguel Lattuada
1
Super schick mit den URLSearchParams! Mein Problem mit der Serialisierung des JSON-Objekts wurde behoben.
Logan H
2
@SukumarMS Es gibt wirklich keine Notwendigkeit für etwas Besonderes, da es Teil des Pfades ist. Verketten Sie einfach die Zeichenfolgen 'blabla.com/page/' + page + '/ activeFilter' + activeFilter. Oder wenn Sie Vorlagenliterale `blabla.com/page / $ {page} / $ {activeFilter}` verwenden möchten.
toskv
10
das funktioniert bei mir:http.get(url, {params: {var1: val1, var2: val2}})
Alexander Suworow
8
searchEigentum wurde von 4.0.0 beraubt -> paramsstattdessen verwenden
BotanMan
180

Winkel bearbeiten> = 4.3.x.

HttpClient wurde zusammen mit HttpParams eingeführt . Unten ein Anwendungsbeispiel:

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

(Alte Antworten)

Winkel bearbeiten> = 4.x.

requestOptions.searchwurde veraltet. Verwenden Sie requestOptions.paramsstattdessen:

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

Ursprüngliche Antwort (Winkel 2)

Sie müssen URLSearchParamswie unten importieren

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

Erstellen Sie dann Ihre Parameter und stellen Sie die http-Anforderung wie folgt:

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())
...
Radouane ROUFID
quelle
3
Ich arbeite nicht für mich. Ich habe mich in den Quellcode vertieft und festgestellt, dass der zweite Parameter von http.get eine RequestOptionsArgs-Schnittstelle erwartet, die URLSearchParams nicht implementiert. Das Umschließen der searchParams in ein RequestOptions-Objekt funktioniert. Wäre schön eine Abkürzung zu haben.
Hardsetting
3
Du hast vollkommen recht, ich habe es vergessen RequestOptions. Ich habe meine Antwort aktualisiert.
Radouane ROUFID
1
Vielen Dank für den Hinweis auf die Ablehnung von search. Behoben mein Problem
Hayden Braxton
Vielen Dank, dass Sie auf diese Änderung hingewiesen haben! Alle Dokumente und Probleme, die ich seit Stunden gefunden habe, haben mich angewiesen, Parameter an die searchEigenschaft anzuhängen .
Rayepps
63

Version 5+

Ab Angular 5 müssen Sie KEINE HttpParams verwenden . Sie können Ihr JSON-Objekt wie unten gezeigt direkt senden.

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

Bitte beachten Sie, dass Datenwerte Zeichenfolge sein sollten, dh; { params: {limit: "2"}}

Version 4.3.x +

Verwenden Sie HttpParams, HttpClient von @ angle / 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});

Könnte einigen helfen!

Rahmathullah M.
quelle
@BrunoPeres versuchen, Ihr verschachteltes Objekt mitJSON.stringify()
Rahmathullah M
1
@ RahmathullahM - Bichu, THX :)
Jamsheer
12

Winkel 6

Sie können die für den Aufruf erforderlichen Parameter mit folgenden Parametern übergeben:

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

Dabei ist x = {Eigenschaft: "123"}.

Wie für die API-Funktion, die "123" protokolliert:

router.get('/example', (req, res) => {
    console.log(req.query.property);
})
Stefan Mitic
quelle
2
Das war eine Änderung, die in Version 5 hinzugefügt wurde. Bereits hier hinzugefügt stackoverflow.com/a/45455904/3276721
Miguel Lattuada
9

Mein Beispiel

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

Meine Methode

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

in meiner Komponente

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

Mit dem Postboten

http://localhost:8080/test/user/?name=Ethem
ethemsulan
quelle
6

In Angular 7/8 können Sie den einfachsten Ansatz verwenden: -

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);
}
Kapil Raghuwanshi
quelle
Dies funktioniert nicht, wenn eine der searchParamsEigenschaften keine stringWerte sind.
Yulian
5

Wenn Sie mehr als einen Parameter senden möchten.

Komponente

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

Bedienung

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

Und fahren Sie mit Ihrer http-Anfrage fort, genau wie @ethemsulan.

Serverseitige Route

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
      });
    });
});
mjwrazor
quelle
In der Get-Anfrage für Ihren Service fehlt mir, wie Sie mit der Get-Anfrage umgehen.
Winnemucca
Oh, ich denke, Sie würden die http get-Anfrage in diese Methode als Rückgabe wie die Antwort von
ethumsulan
2

Sie können HttpParams aus @ angle / common / http verwenden und eine Zeichenfolge mit der Abfrage übergeben. Zum Beispiel:

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

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

Jetzt in deinem Code

this.http.get(urlFull, options);

Und das funktioniert bei dir :)

Ich hoffe dir zu helfen

Cristhian D.
quelle
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);
}

vorausgesetzt, Sie haben jQuery installiert , mache ich npm i jquery --saveund schließe in apps.scriptseinangular-cli.json

Toolkit
quelle
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);
vbrgr
quelle
0

Sie können URL-Parameter verwenden aus der offiziellen Dokumentation verwenden.

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

Muhammed Ozdogan
quelle