私は新しいHttpClientModule
のHttpClient
を使ってクエリパラメータをAPI呼び出しに渡す方法を探していて、まだ解決策を見つけていません。古いHttp
モジュールでは、このようなものを書くでしょう。
getNamespaceLogs(logNamespace) {
// Setup log namespace query parameter
let params = new URLSearchParams();
params.set('logNamespace', logNamespace);
this._Http.get(`${API_URL}/api/v1/data/logs`, { search: params })
}
これにより、次のURLへのAPI呼び出しが発生します。
localhost:3001/api/v1/data/logs?logNamespace=somelogsnamespace
しかし、新しいHttpClient
get()
メソッドにはsearch
プロパティがないので、クエリパラメータをどこに渡すか疑問に思いますか?
私はget()
関数のIntelliSenseを通してそれを見つけることになった。だから、私はここでそれを似たような情報を探している人のために投稿するつもりです。
とにかく、構文はほぼ同じですが、わずかに異なります。 URLSearchParams()
を使用する代わりに、パラメータをHttpParams()
として初期化する必要があり、get()
関数内のプロパティはparams
ではなくsearch
と呼ばれるようになりました。
import { HttpClient, HttpParams } from '@angular/common/http';
getLogs(logNamespace): Observable<any> {
// Setup log namespace query parameter
let params = new HttpParams().set('logNamespace', logNamespace);
return this._HttpClient.get(`${API_URL}/api/v1/data/logs`, { params: params })
}
私は実際にはもう少しパラメータにとらわれないのでこの構文を好む。コードをもう少し短くするために、コードをリファクタリングしました。
getLogs(logNamespace): Observable<any> {
return this._HttpClient.get(`${API_URL}/api/v1/data/logs`, {
params: new HttpParams().set('logNamespace', logNamespace)
})
}
複数のパラメータ
これまでに見つけた最良の方法は、定義したいすべてのパラメーターを定義したParams
オブジェクトを定義することです。以下のコメントで@estusが指摘したように、 This Question には、複数のパラメータをどのように割り当てるかに関して多くの素晴らしい答えがあります。
getLogs(parameters) {
// Initialize Params Object
let params = new HttpParams();
// Begin assigning parameters
params = params.append('firstParameter', parameters.valueOne);
params = params.append('secondParameter', parameters.valueTwo);
// Make the API call using the new parameters.
return this._HttpClient.get(`${API_URL}/api/v1/data/logs`, { params: params })
条件付き論理を持つ複数のパラメータ
私がよく複数のパラメータを使用して行う別のことは、すべての呼び出しでそれらの存在を必要とせずに複数のパラメータを使用できるようにすることです。 Lodashを使用すると、条件付きでAPIの呼び出しにパラメータを追加/削除するのはとても簡単です。 LodashやUnderscores、あるいはVanilla JSで使われている関数そのものはあなたのアプリケーションによって異なるかもしれませんが、プロパティ定義のチェックはかなりうまくいくことがわかりました。以下の関数は、関数に渡されるparameters変数内に対応するプロパティを持つパラメータのみを渡します。
getLogs(parameters) {
// Initialize Params Object
let params = new HttpParams();
// Begin assigning parameters
if (!_.isUndefined(parameters)) {
params = _.isUndefined(parameters.valueOne) ? params : params.append('firstParameter', parameters.valueOne);
params = _.isUndefined(parameters.valueTwo) ? params : params.append('secondParameter', parameters.valueTwo);
}
// Make the API call using the new parameters.
return this._HttpClient.get(`${API_URL}/api/v1/data/logs`, { params: params })
HttpParamatersを作成するときに、(= 5以降) fromObject および fromString コンストラクタパラメータを使用して、作業を少し簡単にすることができます
const params = new HttpParams({
fromObject: {
param1: 'value1',
param2: 'value2',
}
});
// http://localhost:3000/test?param1=value1¶m2=value2
または
const params = new HttpParams({
fromString: `param1=${var1}¶m2=${var2}`
});
//http://localhost:3000/test?paramvalue1=1¶m2=value2
より簡潔な解決策:
this._Http.get(`${API_URL}/api/v1/data/logs`, {
params: {
logNamespace: logNamespace
}
})
あなたはこのようにそれを渡すことができます
let param: any = {'userId': 2};
this.http.get(`${ApiUrl}`, {params: param})
Angular 7では、HttpParamsを使わずに次のようにして動作させることができました。
import { HttpClient } from '@angular/common/http';
export class ApiClass {
constructor(private httpClient: HttpClient) {
// use it like this in other services / components etc.
this.getDataFromServer().
then(res => {
console.log('res: ', res);
});
}
getDataFromServer() {
const params = {
param1: value1,
param2: value2
}
const url = 'https://api.example.com/list'
// { params: params } is the same as { params }
// look for es6 object literal to read more
return this.httpClient.get(url, { params }).toPromise();
}
}
joshrathkeは正しいです。
Angular.io docs には、{@ angular/httpからのURLSearchParamsは廃止予定ですと書かれています。代わりに@ angular/common/httpからのHttpParamsを使用してください。このコードは非常によく似ており、joshrathkeが書いたものと同じです。のようなオブジェクトに保存されている複数のパラメータの場合
{
firstParam: value1,
secondParam, value2
}
あなたもできる
for(let property in objectStoresParams) {
if(objectStoresParams.hasOwnProperty(property) {
params = params.append(property, objectStoresParams[property]);
}
}
継承したプロパティが必要な場合は、それに応じてhasOwnPropertyを削除してください。
RequestOptionsクラスのURLSearchParams型のsearchプロパティは、Angular 4では推奨されません。代わりに、URLSearchParams型のparamsプロパティを使用してください。
{key: 'stringValue'}
ペアに変換できるオブジェクトがある場合は、このショートカットを使用してそれを変換できます。
this._Http.get(myUrlString, {params: {...myParamsObject}});
私は拡散構文が大好きです!
component.ts File --
--------------------------------------------------------------------------
export class UnsubscribeComponent implements OnInit {
email: string;
token: string;
constructor(private httpSvc: HttpService) {}
ngOnInit() {
this.httpSvc.get('pin/unsubscribe'+'?
email='+this.email+'&tn='+this.token).subscribe(res => {
if (res.status === this.appConstants.ResponseCodes.success) {
//Do what you want
} else {
//Do what you want
}
});
}