Сбой HttpClient POST на Angular 6 при обновлении с AngularJS - PullRequest
0 голосов
/ 26 февраля 2019

Я обновляю свое приложение с Angular 1.6 до Angular 6, и я застреваю на экране входа в систему.Ниже приведен фрагмент кода того, что я пытаюсь сделать -

const body = new URLSearchParams();
body.set('username', 'admin')
body.set('password', 'admin');

this.http.post('/log-in',
  body,
  {
    headers: new HttpHeaders()
      .set('Content-Type', 'application/x-www-form-urlencoded')
  }
).subscribe((response: Response) => {
  // Do something here 
}

Это ошибка, которую я получаю, даже если ответ от сервера 200 -

SyntaxError: Unexpected token < in JSON at position 0
at JSON.parse (<anonymous>)
at XMLHttpRequest.onLoad (http.js:1514)
at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:423)
at Object.onInvokeTask (core.js:3811)
at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:422)
at Zone.push../node_modules/zone.js/dist/zone.js.Zone.runTask (zone.js:195)
at ZoneTask.push../node_modules/zone.js/dist/zone.js.ZoneTask.invokeTask [as invoke] (zone.js:498)
at invokeTask (zone.js:1744)
at XMLHttpRequest.globalZoneAwareCallback (zone.js:1781)

Очевидно,Ожидаемый ответ - JSON, но я получаю HTML-страницу

{error: SyntaxError: Unexpected token < in JSON at position 0
at JSON.parse (<anonymous>)   
at XMLHtt…, text: "<!DOCTYPE html>↵<html lang="en" layout ng-app="pfs…rc="scripts/index.js"></script>↵↵</body>↵</html>↵"}

Я много искал, чтобы выяснить, как это исправить, но пока не достиг прогресса.Попробовал предложения в

POST-запрос HttpClient с использованием x-www-form-urlencoded

Как заставить Angular2 выполнить POST с помощью x-www-form-urlencoded

Но ни одна из них не устранила проблему.Я также пытался изменить responseType httpOptions и все еще сталкивался с той же ошибкой.

Это рабочий код AngularJS (1.6) -

var postHeaders = {
  'Content-Type': 'application/x-www-form-urlencoded'
};    

$http({
      method: 'POST',
      url: '/log-in',
      data: $httpParamSerializerJQLike(
        {username: username, password: password}),
      headers: postHeaders,
    }).then(function (success) {
      // Do something
    }

Любая помощьс благодарностью

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Мне удалось выполнить эту работу после того, как я это сделал - мне пришлось добавить следующий responseType к моим опциям

return this.http.post('http://localhost/api/v1/log-in',
  body, { responseType: 'text' as 'json' }
)

Ранее, когда я добавлял responseType в качестве 'text', я продолжал получать сообщение об ошибкенесоответствие типов.Ключом для меня было установить его как 'text' как 'json' .

0 голосов
/ 26 февраля 2019

Скорее всего, это потому, что то, что вы публикуете на своем сервере, неправильно отформатировано, поэтому выдает ошибку и возвращает HTML-страницу.Вы не должны отправлять объект URLSearchParams как ваш body, вы должны отправить обычный объект:

const body = {
    username: 'admin',
    password: 'admin',
};
...