typescript - Angular HttpClient "Http-fel vid parsning"
Jag försöker skicka en POST-förfrågan från Angular 4 till min Laravel-backend.
Min LoginService har den här metoden:
login(email: string, password: string) {
return this.http.post(`http://10.0.1.19/login`, { email, password })
}
Jag prenumererar på denna metod i min LoginComponent:
.subscribe(
(response: any) => {
console.log(response)
location.reload()
},
(error: any) => {
console.log(error)
})
Och detta är min Laravel-backendmetod:
...
if($this->auth->attempt(['email' => $email, 'password' => $password], true)) {
return response('Success', 200);
}
return response('Unauthorized', 401);
Mina Chrome-utvecklarverktyg säger att min förfrågan var framgångsrik med statuskoden 200. Men min Angular-kod triggar error-blocket och ger mig detta meddelande:
Http-fel vid analys för http://10.0.1.19/api/login
Om jag returnerar en tom array från min backend fungerar det... Så Angular försöker tolka mitt svar som JSON? Hur kan jag inaktivera detta?
Svar #1
Du kan ange att de data som ska returneras inte är JSON med responseType.
I ditt exempel kan du använda ett responseType-strängvärde av text:
return this.http.post(
'http://10.0.1.19/login',
{email, password},
{responseType: 'text'})
Den fullständiga listan över alternativ för responseType är:
json(standard)textarraybufferblob
Se dokumentationen för mer information.
Svar #2
Jag vill bara tillägga att du måste utelämna den generiska argumentet på get/post-metoden (.get<T>).
✔️ Detta kommer att fungera:
this.http.get(`https://myapi.com/health`, {responseType: 'text'})
❌ Detta kommer inte att fungera:
this.http.get<string>(`https://myapi.com/health`, {responseType: 'text'})
Den senare kommer att ge ett fel:
Den förväntade typen kommer från egenskapen 'responseType' som deklareras här på typen '{ headers?: HttpHeaders | { [header: string]: string | string[]; } | undefined; observe: "events"; context?: HttpContext | undefined; params?: HttpParams | { ...; } | undefined; reportProgress?: boolean | undefined; responseType?: "json" | undefined; withCredentials?: boolean | undefined; }'
Svar #3
om du har alternativ
return this.http.post(`${this.endpoint}/account/login`,payload, { ...options, responseType: 'text' })
