나는 새와 API 호출에 쿼리 매개 변수를 전달할 수있는 방법을 찾고있다 HttpClientModule
의 HttpClient
및 해결책을 찾기 위해 아직있다. 이전 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가 지적 했듯이이 질문 에는 여러 매개 변수를 할당하는 방법에 대한 많은 대답 이 있습니다.
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 })
답변
HttpParamater를 만들 때 (버전 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
답변
이렇게 전달할 수 있습니다
let param: any = {'userId': 2};
this.http.get(`${ApiUrl}`, {params: param})
답변
더 간결한 솔루션 :
this._Http.get(`${API_URL}/api/v1/data/logs`, {
params: {
logNamespace: logNamespace
}
})
답변
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();
}
}
답변
{key: 'stringValue'}
쌍 으로 변환 할 수있는 개체가있는 경우이 바로 가기를 사용하여 변환 할 수 있습니다.
this._Http.get(myUrlString, {params: {...myParamsObject}});
나는 확산 구문을 좋아한다!
답변
joshrathke가 옳다.
angular.io에서 문서 것으로 기록 @ 각도 / 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를 제거하십시오.