typescript - angular - cum să accesezi răspunsul unui http post și să îl parsezi ca json?
Încerc să trimit acest POST către un API, dar pare imposibil să accesez datele răspunsului (care vin ca text și trebuie să le parsez ca JSON).
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { tap } from 'rxjs/operators';
import { Storage } from '@ionic/storage';
import { EnvService } from './env.service';
import { Injectable } from '@angular/core';
import { map } from "rxjs/operators";
...
login(email: String, password: String) {
let headers = new HttpHeaders({
'Accept' :'*/*',
'Content-Type' :'text/plain'
});
let formData = {
user : 'myuser',
pass : 'mypass',
retsession : true
}
return this.http.post(this.env.API_URL+'/login', JSON.stringify(formData), {headers:headers}).pipe(
map((res:Response) => (res.text()))
.subscribe(data => {console.log(data)})
);
}
Primesc această eroare:
[ng] ERROR in src/app/services/auth.service.ts(42,8): error TS2339: Property 'subscribe' does not exist on type 'OperatorFunction<Response, Promise<string>>'.
Fac ceva greșit?
Răspuns #1
Deoarece răspunsul venit de la server este de tip text, ați încercat să specificați în mod explicit răspunsul ca text în cererea post așa cum urmează,
this.http.post(url, formData, {responseType: 'text' })
Implicit, HttpClient-ul angular încearcă să proceseze răspunsul ca json și eșuează în parser atunci când se primește un răspuns bazat pe text, deși cererea http are succes
Răspunsul #2
De ce faci mapare în abonamentul tău? Tot ce trebuie să faci este să afișezi datele.
Doar folosește .subscribe(data => console.log(JSON.stringify(data)) și scapă de map.
Editare: De asemenea, .subscribe-ul tău trebuie să fie în afara pipe-ului tău, dacă chiar trebuie să îl pipe-uiești. Ceea ce nu este cazul în acest exemplu.
return this.http.post(url, JSON.stringify(formData), {headers:headers}).pipe(
map((res:Response) => (res.text()))).subscribe(data => {console.log(data)}
);
