Angular의 HTTP 요청에 URL 인수 (쿼리 문자열)를 전달하는 방법은 무엇입니까?


265

Angular에서 HTTP 요청을 작성하고 있지만 URL 인수 (쿼리 문자열)를 추가하는 방법을 모르겠습니다.

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

이제 내 StaticSettings.BASE_URL은 http://atsomeplace.com/ 과 같은 쿼리 문자열이없는 URL과 비슷 하지만 http://atsomeplace.com/?var1=val1&var2=val2

var1과 var2는 내 HTTP 요청 객체에 어디에 있습니까? 객체처럼 추가하고 싶습니다.

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

그런 다음 HTTP 모듈만이 URL 쿼리 문자열로 구문 분석하기 위해 작업을 수행합니다.


stackoverflow.com/questions/26541801/… 이것을 참조하십시오. 호출하기 전에 URL을 작성하고이를 전달하여 BASE_URL 대신 함수를 구독하십시오. 2cents
pratikpawar

답변:


329

HttpClient를의 방법은 사용자가 설정할 수 PARAMS을 그것의 옵션에서.

@ angular / common / http 패키지에서 HttpClientModule 을 가져 와서 구성 할 수 있습니다 .

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

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

그런 다음 HttpClient를 주입하고 이를 사용하여 요청을 수행 할 수 있습니다 .

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

버전 4 이전의 각도 버전의 경우 Http를 사용하여 동일한 작업을 수행 할 수 있습니다 서비스를 .

Http.get의 방법을 구현하는 객체를 얻어 RequestOptionsArgs 번째 매개 변수.

해당 객체 의 검색 필드를 사용하여 문자열 또는 URLSearchParams 객체 .

예를 들면 :

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

Http 클래스 의 설명서에 자세한 내용이 있습니다. 그것은 찾을 수 있습니다 여기에 와 작업을 예를 여기에 .


2
요지 : gist.github.com/MiguelLattuada/bb502d84854ad9fc26e0이 방법 URLSearchParams 객체를 사용하기 위해, 다시 한번 감사 @toskv
미구엘 Lattuada

1
URLSearchParams로 매끄럽게! JSON 객체 직렬화와 관련된 문제를 해결했습니다.
로건 H

2
@SukumarMS는 경로의 일부이기 때문에 특별한 것이 필요하지 않습니다. 문자열 'blabla.com/page/'+ page + '/ activeFilter'+ activeFilter를 연결하십시오. 또는 템플릿 리터럴`blabla.com/page / $ {page} / $ {activeFilter}`를 사용하려는 경우.
toskv 2016 년

10
이것은 나를 위해 작동합니다 :http.get(url, {params: {var1: val1, var2: val2}})
Alexander Suvorov

8
search속성은 4.0.0에서 params
폐기

180

각도 편집> = 4.3.x

HttpClientHttpParams 와 함께 도입되었습니다 . 사용 예 아래 :

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

(오래된 답변)

각도 편집> = 4.x

requestOptions.search더 이상 사용되지 않습니다. requestOptions.params대신 사용하십시오 :

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

원래 답변 (Angular 2)

URLSearchParams아래와 같이 가져와야 합니다

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

그런 다음 매개 변수를 작성하고 다음과 같이 http 요청을하십시오.

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
나를 위해 작동하지 않습니다. 소스 코드를 파고 http.get의 두 번째 매개 변수에 URLSearchParams가 구현하지 않은 RequestOptionsArgs 인터페이스가 필요하다는 것을 알았습니다. requestOptions 객체 안에 searchParams를 래핑하면 작동합니다. 그래도 바로 가기가 좋을 것입니다.
hardsetting

3
당신은 완전히 옳았습니다 RequestOptions. 답변을 업데이트했습니다.
Radouane ROUFID

1
의 지원 중단을 지적 해 주셔서 감사합니다 search. 내 문제를 해결
Hayden Braxton

이 변경 사항을 지적 해 주셔서 감사합니다! 몇 시간 동안 찾은 모든 문서와 문제는 매개 변수를 search속성 에 첨부하도록 지시 했습니다.
rayepps

63

버전 5 이상

Angular 5 이상 에서는 HttpParams를 사용할 필요가 없습니다 . 아래와 같이 json 객체를 직접 보낼 수 있습니다.

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

데이터 값은 문자열이어야합니다. { params: {limit: "2"}}

버전 4.3.x +

사용 HttpParams, HttpClient를을 에서 @ 각도 / 일반 / 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});

도움이 될 수 있습니다!


@BrunoPeres를 사용하여 중첩 된 개체 stringifying 시도JSON.stringify()
Rahmathullah M을

1
@RahmathullahM-bichu, THX :)
Jamsheer

12

각도 6

매개 변수를 사용하여 전화를 받기 위해 필요한 매개 변수를 전달할 수 있습니다.

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

여기서 x = {속성 : "123"}.

"123"을 기록하는 API 기능은 다음과 같습니다.

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

2
그의 버전 5. 이미 여기에 추가로 첨가 변화했다 stackoverflow.com/a/45455904/3276721
미구엘 Lattuada을

9

내 예

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

내 방법

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

내 컴포넌트에서

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

우편 배달부

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

6

최신 Angular 7/8에서는 가장 간단한 방법을 사용할 수 있습니다.

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

어떤 경우에는이 기능이 작동하지 않습니다 searchParams'특성이 없습니다 string값.
Yulian

5

둘 이상의 매개 변수를 보내려는 경우

구성 요소

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

서비스

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

그리고 @ethemsulan이 한 것처럼 http 요청을 계속하십시오.

서버 측 경로

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

귀하의 서비스에 대한 요청에 귀하가 요청을 처리하는 방법이 누락되었습니다.
Winnemucca

난 당신이 ethumsulan의 답변과 같은 반환으로 그 방법으로 http get 요청을 넣어 것 같아요
mjwrazor

2

@ angular / common / http의 HttpParams 를 사용 하고 쿼리와 함께 문자열을 전달할 수 있습니다. 예를 들면 다음과 같습니다.

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

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

이제 코드에서

this.http.get(urlFull, options);

그리고 이것은 당신을 위해 작동합니다 :)

도와 드릴게요


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

당신이 것을 제공 jQuery를 설치 , 내가 할 npm i jquery --save과에 포함 apps.scriptsangular-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);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.