Como passar argumentos de URL (string de consulta) para uma solicitação HTTP no Angular?

266

Estou criando uma solicitação HTTP no Angular, mas não sei como adicionar argumentos de URL (string de consulta) a ele.

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

Agora, meu StaticSettings.BASE_URL é algo como um URL sem string de consulta como: http://atsomeplace.com/, mas eu quero que seja http://atsomeplace.com/?var1=val1&var2=val2

Onde var1 e var2 se encaixam no meu objeto de solicitação Http? Eu quero adicioná-los como um objeto.

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

e, em seguida, apenas o módulo Http faz o trabalho para analisá-lo na string de consulta da URL.

Miguel Lattuada
fonte
stackoverflow.com/questions/26541801/… consulte isso. Crie o URL antes da chamada e passe-o para a função de inscrição no lugar de BASE_URL. 2cents
pratikpawar

Respostas:

330

Os métodos HttpClient permitem definir os parâmetros nas opções.

Você pode configurá-lo importando o HttpClientModule do pacote @ angular / common / http.

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

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

Depois disso, você pode injetar o HttpClient e usá-lo para fazer a solicitação.

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

Para versões angulares anteriores à versão 4, você pode fazer o mesmo usando o serviço Http .

O método Http.get usa um objeto que implementa RequestOptionsArgs como um segundo parâmetro.

O campo de pesquisa desse objeto pode ser usado para definir uma string ou um objeto URLSearchParams .

Um exemplo:

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

A documentação para a classe Http tem mais detalhes. Pode ser encontrado aqui e um exemplo de trabalho aqui .

toskv
fonte
2
A essência: gist.github.com/MiguelLattuada/bb502d84854ad9fc26e0 como usar URLSearchParams objeto, obrigado novamente @toskv
Miguel Lattuada
1
Super esperto com o URLSearchParams! Resolvi meu problema com a serialização do objeto JSON.
Logan H
2
@SukumarMS realmente não há necessidade de nada de especial, pois faz parte do caminho. Apenas concatene as strings 'blabla.com/page/' + page + '/ activeFilter' + activeFilter. Ou se você quiser usar literais de modelo `blabla.com/page / $ {page} / $ {activeFilter}`.
toskv
10
isso funciona para mim:http.get(url, {params: {var1: val1, var2: val2}})
Alexander Suvorov
8
searchpropriedade foi privada de 4.0.0 -> use paramsvez disso
BotanMan 10/17/17
180

Editar Angular> = 4.3.x

HttpClient foi introduzido junto com HttpParams . Abaixo um exemplo de uso:

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

(Respostas antigas)

Editar Angular> = 4.x

requestOptions.searchfoi descontinuado. Use em requestOptions.paramsvez disso:

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

Resposta original (Angular 2)

Você precisa importar URLSearchParamscomo abaixo

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

E, em seguida, crie seus parâmetros e faça a solicitação http da seguinte maneira:

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
fonte
3
Não está trabalhando para mim. Analisei o código-fonte e descobri que o segundo parâmetro do http.get espera uma interface RequestOptionsArgs, que URLSearchParams não implementa. Quebrar os searchParams dentro de um objeto RequestOptions funciona. Seria bom ter um atalho.
hardsetting 23/02
3
Você está totalmente certo, eu esqueci RequestOptions. Eu atualizei minha resposta.
Radouane ROUFID
1
Obrigado por apontar a descontinuação de search. Corrigido meu problema
Hayden Braxton
Obrigado por apontar essa alteração! Todos os documentos e problemas que encontrei por horas me pediram para anexar parâmetros à searchpropriedade.
rayepps
63

Versão 5+

Com o Angular 5 e versões posteriores , você NÃO precisa usar HttpParams . Você pode enviar diretamente seu objeto json, como mostrado abaixo.

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

Observe que os valores dos dados devem ser string, ou seja; { params: {limit: "2"}}

Versão 4.3.x +

Use HttpParams, HttpClient de @ 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});

Pode ajudar alguns!

Rahmathullah M
fonte
@BrunoPeres tente especificar seu objeto aninhado usando #JSON.stringify()
Rahmathullah M #:
1
@RahmathullahM - bichu, THX :)
Jamsheer
12

Angular 6

Você pode passar os parâmetros necessários para receber chamadas usando params:

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

onde x = {propriedade: "123"}.

Quanto à função api que registra "123":

router.get('/example', (req, res) => {
    console.log(req.query.property);
})
Stefan Mitic
fonte
2
Isso é uma mudança adicionado na versão 5. Já adicionado aqui stackoverflow.com/a/45455904/3276721
Miguel Lattuada
9

Meu exemplo

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

Meu método

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

no meu componente

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

Por carteiro

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

No mais recente Angular 7/8, você pode usar a abordagem mais simples: -

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
fonte
Isso não funcionará se nenhuma das searchParamspropriedades 'não for stringvalores.
Yulian
5

Se você planeja enviar mais de um parâmetro.

Componente

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

Serviço

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

E continue com sua solicitação http, exatamente como @ethemsulan.

Rota do lado do servidor

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
fonte
Na solicitação de obtenção do seu serviço, sinto falta de como você está lidando com a solicitação de obtenção.
Winnemucca #
Oh, eu acho que você iria colocar o pedido HTTP GET em que o método como um retorno como resposta de ethumsulan
mjwrazor
2

Você pode usar HttpParams de @ angular / common / http e passar uma string com a consulta. Por exemplo:

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

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

Agora no seu código

this.http.get(urlFull, options);

E isso funciona para você :)

Eu espero te ajudar

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

desde que você tenha instalado o jQuery , eu o npm i jquery --saveincluo apps.scriptsnoangular-cli.json

Kit de ferramentas
fonte
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
fonte
0

Você pode usar parâmetros de URL na documentação oficial.

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

Muhammed Ozdogan
fonte