我正在将我的应用程序从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>↵"}
我已经搜索了很多来弄清楚如何解决这个问题但到目前为止没有取得任何进展。尝试过的建议
HttpClient POST request using x-www-form-urlencoded
How to force Angular2 to POST using x-www-form-urlencoded
但它都没有解决问题。我也尝试更改httpOptions的responseType并仍然面临同样的错误。
这是工作的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
}
任何帮助是极大的赞赏。
这很可能是因为您发布到后端的内容格式不正确,因此会抛出错误并返回HTML页面。你不应该发送一个URLSearchParams
对象作为你的body
,你应该发送一个常规对象:
const body = {
username: 'admin',
password: 'admin',
};
在我这样做之后,我能够完成这项工作 - 我必须在我的选项中添加以下responseType
return this.http.post('http://localhost/api/v1/log-in',
body, { responseType: 'text' as 'json' }
)
以前当我将responseType添加为'text'时,我不断收到有关类型不匹配的错误。对我来说,关键是把它设置为'文字'为'json'。