J'essaie d'envoyer une demande POST de Angular 4 à mon backend Laravel.
Mon LoginService a cette méthode:
login(email: string, password: string) {
return this.http.post(`http://10.0.1.19/login`, { email, password })
}
Je souscris à cette méthode dans mon LoginComponent:
.subscribe(
(response: any) => {
console.log(response)
location.reload()
},
(error: any) => {
console.log(error)
})
Et voici ma méthode d'arrière-plan Laravel:
...
if($this->auth->attempt(['email' => $email, 'password' => $password], true)) {
return response('Success', 200);
}
return response('Unauthorized', 401);
Mes Chrome outils de développement indiquent que ma demande a abouti avec 200 codes d'état. Mais mon code Angular déclenche le bloc error
et me donne le message suivant:
Echec de HTTP lors de l'analyse syntaxique pour http://10.0.1.19/api/login
Si je renvoie un tableau vide à partir de mon backend, cela fonctionne ... Alors, Angular tente d'analyser ma réponse au format JSON? Comment puis-je désactiver cela?
Vous pouvez spécifier que les données à renvoyer sont et non JSON à l'aide de responseType
.
Dans votre exemple, vous pouvez utiliser une chaîne responseType
de text
, comme ceci:
return this.http.post(
'http://10.0.1.19/login',
{email, password},
{responseType: 'text'})
Les autres options sont json
(valeur par défaut), arraybuffer
et blob
.
Voir le docs pour plus d'informations.
si vous avez des options
return this.http.post(`${this.endpoint}/account/login`,payload, { ...options, responseType: 'text' })
Même en ajoutant responseType, je l’ai traité pendant des jours sans succès. Je l'ai finalement eu. Assurez-vous que dans votre script backend vous ne définissez pas header comme - ("Content-Type: application/json);
Parce que si vous le convertissez en texte mais que le serveur demande json, il renverra une erreur ...
Je rencontrais le même problème dans mon application Angular. J'utilisais l'API RocketChat REST dans mon application et j'essayais d'utiliser le rooms.createDiscussion
, mais comme une erreur, comme ci-dessous.
ERROR Error: Uncaught (in promise): HttpErrorResponse: {"headers":{"normalizedNames":{},"lazyUpdate":null},"status":200,"statusText":"OK","url":"myurl/rocketchat/api/v1/rooms.createDiscussion","ok":false,"name":"HttpErrorResponse","message":"Http failure during parsing for myrul/rocketchat/api/v1/rooms.createDiscussion","error":{"error":{},"text":"
J'ai essayé quelques choses comme changer le responseType: 'text'
mais aucune d'entre elles n'a fonctionné. À la fin, j'ai pu constater que le problème était lié à l'installation de RocketChat. Comme mentionné dans le journal des modifications de RocketChat , l'API rooms.createDiscussion
a été introduite dans la version 1.0.0. Malheureusement, j'utilisais une version inférieure.
Ma suggestion est de vérifier si l'API REST fonctionne correctement avant de passer du temps à corriger l'erreur dans votre code Angular. J'ai utilisé la commande curl
pour vérifier cela.
curl -H "X-Auth-Token: token" -H "X-User-Id: userid" -H "Content-Type: application/json" myurl/rocketchat/api/v1/rooms.createDiscussion -d '{ "prid": "GENERAL", "t_name": "Discussion Name"}'
Là aussi, je recevais un HTML non valide en réponse.
<!DOCTYPE html>
<html>
<head>
<meta name="referrer" content="Origin-when-crossorigin">
<script>/* eslint-disable */
'use strict';
(function() {
var debounce = function debounce(func, wait, immediate) {
Au lieu d'une réponse JSON valide comme suit.
{
"discussion": {
"rid": "cgk88DHLHexwMaFWh",
"name": "WJNEAM7W45wRYitHo",
"fname": "Discussion Name",
"t": "p",
"msgs": 0,
"usersCount": 0,
"u": {
"_id": "rocketchat.internal.admin.test",
"username": "rocketchat.internal.admin.test"
},
"topic": "general",
"prid": "GENERAL",
"ts": "2019-04-03T01:35:32.271Z",
"ro": false,
"sysMes": true,
"default": false,
"_updatedAt": "2019-04-03T01:35:32.280Z",
"_id": "cgk88DHLHexwMaFWh"
},
"success": true
}
Ainsi, après la mise à jour vers la dernière version de RocketChat , j'ai pu utiliser l'API REST mentionnée.
Vous devriez également vérifier votre code JSON (pas dans DevTools, mais sur un backend). Angular HttpClient éprouvant de la difficulté à analyser JSON avec \0
caractères et DevTools l'ignorera à ce moment-là. Il est donc assez difficile de la détecter dans Chrome.
Basé sur cet article