angular - Gör ett http-anrop baserat på föregående resultat
Jag behöver göra två HTTP-anrop (först GET och sedan POST), det andra baserat på resultatet av det första.
Här är svaret från GET:
{
"weekNbr": "34-2017",
"startDate": "2017-09-16",
"endDate": "2017-09-22"
}
Detta svar kommer sedan att manipuleras och skickas som en POST-förfrågan med följande JSON:
{
"weekNbr": 34, (as received above)
"year": 2017 (as received above)
}
En lösning:
http.get(url1).pipe(
map(do your maipulation)
).subscribe(
(newlyCreatedObject) => {
return http.post(url2,newlyCreatedObject);
}
);
Men jag tror inte att det är rätt sätt.
OBS: Dessa anrop ska göras i en enda tjänst. Om det finns några rxjs-operatörer för att göra samma sak, skulle det uppskattas mycket.
Svar #1
Du kan använda flatMap/mergeMap-operatören för att göra två HTTP-förfrågningar, där den ena beror på den andra.
Gilla :
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 => {});
Svar #2
jag har förberett denna dummytjänst :
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();
Endast för demonstration har jag bytt http-observable till dummy of-observable.
levande prov
