Fazer uma chamada http com base no resultado anterior

votos
1

Eu preciso fazer duas chamadas HTTP (primeira GET e POST segundo), o segundo com base no resultado da primeira.

Aqui está a resposta do GET:

{
    weekNbr: 34-2017,
    startDate: 2017-09-16,
    endDate: 2017-09-22
}

Esta resposta será, em seguida, ser manipulado e enviado como um pedido POST com o seguinte JSON:

{
    weekNbr: 34, (as received above)
    year: 2017 (as received above)
}

Uma solução:

http.get(url1).pipe(
    map(do your maipulation)
).subscribe(
    (newlyCreatedObject) => {
        return http.post(url2,newlyCreatedObject);
    }
);

Mas eu não acho que é a maneira correta.

NOTA: Estas chamadas devem ser feitas em um único serviço. Se houver quaisquer operadores rxjs para fazer o mesmo, seria muito apreciada.

Publicado 19/09/2018 em 12:58
fonte usuário
Em outras línguas...                            


2 respostas

votos
4

Você pode usar o flatMap/mergeMapoperador para fazer duas solicitações HTTP, um dependendo do outro.

Gostar:

http.get(data).flatMap(res => {
    // res is response of Get
    // manipulate the data and passed in post call
    return http.post(data);
})
.map(res => {})
.catch(e => {});
Respondeu 19/09/2018 em 13:15
fonte usuário

votos
0

eu tenho preparar este serviço fictício:

import {of, Observable} from 'rxjs';
import {flatMap} from 'rxjs/operators';
/**
 * Dummy get observable.
 */
export class MyService {

  getInformation$(): Observable<{foo:string}> {
    return of({foo:'bar'});
  }

  postInformation$(params:{foo:string}): Observable<any> {
    return of({
      fooUpperCase: params.foo.toUpperCase() // Stupid transformation for demonstration only
    });
  }

  main() {
    this.getInformation$().pipe(
      flatMap(data => this.postInformation$(data)) // receive each next and return new observable. 
    ).subscribe(console.log);
  }
}

new MyService().main();

Somente para demonstração, eu tenho interruptor http observável a manequim ofobservável.

amostra viva

Respondeu 19/09/2018 em 13:20
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more