Kuinka välittää URL-argumentteja (kyselymerkkijono) HTTP-pyyntöön Angularissa?
Haluaisin laukaista HTTP-pyynnön Angular-komponentista, mutta en tiedä, kuinka lisätä URL-argumentteja (kyselymerkkijono) siihen.
this.http.get(StaticSettings.BASE_URL).subscribe(
(response) => this.onGetForecastResult(response.json()),
(error) => this.onGetForecastError(error.json()),
() => this.onGetForecastComplete()
)
Nyt minun StaticSettings.BASE_URL on kuin URL ilman kyselymerkkijonoa, kuten: http://atsomeplace.com/, mutta haluan sen olevan kuten http://atsomeplace.com/?var1=val1&var2=val2
Kuinka lisään var1 ja var2 HTTP-pyyntöobjektiini objektina?
{
query: {
var1: val1,
var2: val2
}
}
ja sitten pelkkä HTTP-moduuli hoitaa työn muuntaakseen sen URL-kyselymerkkijonoksi.
Vastaus #1
HttpClient-menetelmät antavat sinun asettaa params-asetukset sen vaihtoehdoissa.
Voit määrittää sen tuomalla HttpClientModule @angular/common/http-paketista.
import {HttpClientModule} from '@angular/common/http';
@NgModule({
imports: [ BrowserModule, HttpClientModule ],
declarations: [ App ],
bootstrap: [ App ]
})
export class AppModule {}
Tämän jälkeen voit injektoida HttpClient-objektin ja käyttää sitä pyynnön tekemiseen.
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);
}
}
Angularin versioissa ennen versiota 4 voit tehdä saman käyttämällä Http-palvelua.
Http.get-metodi ottaa toisena parametrina objektin, joka toteuttaa RequestOptionsArgsin.
Kyseisen objektin hakukenttää voidaan käyttää merkkijonon tai URLSearchParams-objektin asettamiseen.
Esimerkki:
// 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()
);
Luokkaa Http koskevat asiakirjat sisältävät lisää tietoja. Ne löytyvät tästä ja toimiva esimerkki tästä.
Vastaus #2
Muokkaa Angular ≥ 4.3.x
HttpClient on otettu käyttöön yhdessä HttpParamsin kanssa. Alla esimerkki käytöstä:
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(...);
(Vanhat vastaukset)
Muokkaa Angular ≥ 4.x
requestOptions.search on poistettu käytöstä. Käytä sen sijaan requestOptions.params.
let requestOptions = new RequestOptions();
requestOptions.params = params;
Alkuperäinen vastaus (Angular 2)
Sinun täytyy tuoda URLSearchParams seuraavasti
import { Http, RequestOptions, URLSearchParams } from '@angular/http';
Sitten rakenna parametrisi ja tee http-pyyntö seuraavasti:
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())
...
Vastaus #3
Versio 5+
Angular 5:llä ja uudemmissa sinun EI tarvitse käyttää HttpParamsia. Voit lähettää JSON-objektisi suoraan alla olevan esimerkin mukaisesti.
let data = {limit: "2"};
this.httpClient.get<any>(apiUrl, {params: data});
Huomaa, että tietojen arvot tulisi olla merkkijonoja, eli { params: {limit: "2"}}
Versio 4.3.x+
Käytä HttpParams, HttpClient kohteesta @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});
Kokeile myös muuttaa sisäkkäinen objektisi merkkijonoksi käyttämällä JSON.stringify().
Vastaus #4
Angular 6
Voit välittää get-kutsulle tarvittavat parametrit käyttämällä paramsia:
this.httpClient.get<any>(url, { params: x });
missä x={ property: "123" }.
Entä API-funktio, joka kirjaa "123":
router.get('/example', (req, res) => {
console.log(req.query.property);
})
