Angular HttpClient "Ошибка Http при разборе"
Я пытаюсь отправить запрос POST из Angular 4 на мой сервер Laravel.
Мой LoginService имеет этот метод:
login(email: string, password: string) {
return this.http.post('http://10.0.1.19/login', { email, password })
}
Я подписываюсь на этот метод в моем LoginComponent:
.subscribe(
(response: any) => {
console.log(response)
location.reload()
},
(error: any) => {
console.log(error)
})
И это мой метод бэкэнда Laravel:
...
if($this->auth->attempt(['email' => $email, 'password' => $password], true)) {
return response('Success', 200);
}
return response('Unauthorized', 401);
Мой Chrome Dev Tools говорит, что мой запрос был успешно обработан с 200 кодами состояния. Но мой код Angular запускает блок error
и выдает мне следующее сообщение:
Ошибка Http при разборе http://10.0.1.19/api/login
Если я возвращаю пустой массив из моего бэкэнда, он работает... Итак, Angular пытается проанализировать мой ответ как JSON? Как я могу отключить это?
Ответы
Ответ 1
Вы можете указать, что возвращаемые данные не являются JSON, используя responseType
.
В вашем примере вы можете использовать строковое значение responseType
text
, например так:
return this.http.post(
'http://10.0.1.19/login',
{email, password},
{responseType: 'text'})
Другие параметры: json
(по умолчанию), arraybuffer
и blob
.
Смотрите документы для получения дополнительной информации.
Ответ 2
если у вас есть параметры
return this.http.post(`${this.endpoint}/account/login`,payload, { ...options, responseType: 'text' })
Ответ 3
Даже добавив responseType, я занимался этим несколько дней безуспешно. Наконец то я понял. Убедитесь, что в вашем бэкэнд-скрипте вы не определяете заголовок как - ("Content-Type: application/json);
Потому что, если вы включите его в текст, но сервер запрашивает JSON, он вернет ошибку...
Ответ 4
Я столкнулся с той же проблемой в моем приложении Angular. Я использовал RocketChat REST API в своем приложении, и я пытался использовать rooms.createDiscussion
, но в качестве ошибки, как rooms.createDiscussion
ниже.
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":"
Я пробовал несколько вещей, таких как изменение responseType: 'text'
но ни одна из них не работала. В конце я смог найти, что проблема была с моей установкой RocketChat. Как упоминалось в журнале изменений RocketChat, API rooms.createDiscussion
был представлен в версии 1.0.0, к сожалению, я использовал более низкую версию.
Я предлагаю проверить, работает ли REST API нормально или нет, прежде чем тратить время на исправление ошибки в коде Angular. Я использовал команду curl
чтобы проверить это.
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"}'
Там же я получаю неверный HTML в ответ.
<!DOCTYPE html>
<html>
<head>
<meta name="referrer" content="origin-when-crossorigin">
<script>/* eslint-disable */
'use strict';
(function() {
var debounce = function debounce(func, wait, immediate) {
Вместо правильного ответа JSON, как указано ниже.
{
"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
}
Поэтому после обновления до последней версии RocketChat я смог использовать упомянутый REST API.