Fui à procura de uma maneira de passar consulta parâmetros para uma chamada de API com o novo HttpClientModule
's HttpClient
e ainda têm de encontrar uma solução. Com o Http
módulo antigo , você escreveria algo assim.
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 })
}
Isso resultaria em uma chamada de API para o seguinte URL:
localhost:3001/api/v1/data/logs?logNamespace=somelogsnamespace
No entanto, o novo HttpClient
get()
método não tem uma search
propriedade, por isso estou me perguntando para onde passar os parâmetros da consulta?
angular
typescript
http
lodash
angular-httpclient
joshrathke
fonte
fonte
this.httpClient.get(url, { params }
Confira stackoverflow.com/a/54211610/5042169Respostas:
Acabei encontrando-o através do IntelliSense na
get()
função. Então, vou postá-lo aqui para quem estiver procurando informações semelhantes.De qualquer forma, a sintaxe é quase idêntica, mas um pouco diferente. Em vez de usar,
URLSearchParams()
os parâmetros precisam ser inicializados comoHttpParams()
e a propriedade dentro daget()
função agora é chamada emparams
vez desearch
.Na verdade, eu prefiro essa sintaxe, pois é um pouco mais independente de parâmetro. Também refatorei o código para torná-lo um pouco mais abreviado.
Parâmetros múltiplos
A melhor maneira que eu encontrei até agora é definir um
Params
objeto com todos os parâmetros que eu quero definir definidos dentro. Como @estus apontou no comentário abaixo, há muitas ótimas respostas nesta pergunta sobre como atribuir vários parâmetros.Vários parâmetros com lógica condicional
Outra coisa que costumo fazer com vários parâmetros é permitir o uso de vários parâmetros sem exigir sua presença em todas as chamadas. Usando o Lodash, é bastante simples adicionar / remover condicionalmente parâmetros de chamadas para a API. As funções exatas usadas no Lodash, no Underscores ou no vanilla JS podem variar dependendo do seu aplicativo, mas eu descobri que a verificação da definição da propriedade funciona muito bem. A função abaixo passará apenas parâmetros que possuem propriedades correspondentes dentro da variável de parâmetros passados para a função.
fonte
let params = new HttpParams(); params.set(...)
não funcionará como esperado. Veja stackoverflow.com/questions/45459532/…new HttpParams({fromObject: { param1: 'value1', ... }});
é a abordagem mais fácil (angular 5+) entãoparams.set(...)
.Você pode (na versão 5+) usar o fromObject e fromString parâmetros do construtor ao criar HttpParamaters para tornar as coisas um pouco mais fácil
ou:
fonte
const params = {'key': 'value'}
para:http.get('/get/url', { params: params })
Você pode passar assim
fonte
params
Uma solução mais concisa:
fonte
Com o Angular 7, consegui trabalhar usando o seguinte, sem usar HttpParams.
fonte
Se você possui um objeto que pode ser convertido em
{key: 'stringValue'}
pares, pode usar este atalho para convertê-lo:Eu simplesmente amo a sintaxe de propagação!
fonte
Joshrathke está certo.
Em angular.io, o docs está escrito que URLSearchParams de @ angular / http está obsoleto . Em vez disso, você deve usar HttpParams de @ angular / common / http . O código é bastante semelhante e idêntico ao que joshrathke escreveu. Para vários parâmetros salvos, por exemplo, em um objeto como
você também poderia fazer
Se você precisar de propriedades herdadas, remova o hasOwnProperty adequadamente.
fonte
A propriedade de pesquisa do tipo URLSearchParams na classe RequestOptions está obsoleta no angular 4. Em vez disso, você deve usar a propriedade params do tipo URLSearchParams .
fonte