java - SyntaxError:JSON.parse + angularjs 位置 0 处的 JSON 中的意外标记 s
问题描述
我正在使用 springmvc 和 angularjs。我正在尝试将来自 springmvc 控制器的字符串响应发送到角度控制器,但面对浏览器控制台上显示的以下错误消息,并且从 springmvc 返回的响应没有在 angularjs 端打印。
错误:
SyntaxError: JSON.parse ()中位置 0 处的 JSON 中的意外标记 s
示例代码:js:
myApp.controller('myTestCtrl', function ($rootScope, $scope,MyService) {
$sco[e.submitInfo = function(){
var data = new FormData();
var allInfo =
{
'name': $scope.name,
'id': $scope.id,
'product': $scope.product,
'message':$scope.message
}
//files to be attached if exists
for (var i in $scope.filesAttached) {
var file = $scope.filesToAttach[i]._file;
data.append("file", file);
}
MyService.sendAllInfo(data).then(
function (response) {
if (response === "") {
alert("success");
//logic
}else{
alert("in else part " + response);
}},
function (errResponse) {
console.log("Error while retrieving response " + errResponse);
});
};
});
}});
我的服务:
myService.sendAllInfo = function (data) {
var deferred = $q.defer();
var repUrl = myURL + '/myController/allInfo.form';
var config = {
headers: {'Content-Type': undefined},
transformRequest: []
}
$http.post(repUrl,data,config)
.then(
function (response) {
alert("response json in service: "+ response);
deferred.resolve(response.data);
},
function(errResponse){
console.error('Error while getting response.data'+ errResponse);
deferred.reject(errResponse);
}
);
return deferred.promise;
};
弹簧MVC:
@RequestMapping(value = "/allInfo", method = RequestMethod.POST, produces = MediaType.TEXT_PLAIN_VALUE)
public @ResponseBody
String allInfoData(@RequestParam("data") String data,@RequestParam("file") List<MultipartFile> files){
//logic
return "success";
}
在我上面的 spring 控制器代码中,我将成功字符串返回给 angularjs 控制器,但在浏览器中显示以下错误。
SyntaxError: JSON.parse () 中位置 0 处的 JSON 中的意外标记 s
注意:上面只是示例代码,它完美地击中了弹簧控制器,问题只是在捕捉弹簧控制器到角度控制器的响应时。我尝试更改produces=MediaType.TEXT_PLAIN_VALUE
为,produces={"application/json"}
但仍然显示相同的错误。
解决方案
为避免解析字符串,请使用transformResponse: angular.identity
:
myService.sendAllInfo = function (data) {
̶ ̶v̶a̶r̶ ̶d̶e̶f̶e̶r̶r̶e̶d̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶
var repUrl = myURL + '/myController/allInfo.form';
var config = {
headers: {'Content-Type': undefined},
transformRequest: [],
//IMPORTANT
transformResponse: angular.identity
}
var promise = $http.post(repUrl,data,config)
.then(
function (response) {
alert("response json in service: "+ response);
return response.data;
},
function(errResponse){
console.error('Error while getting response.data'+ errResponse);
throw errResponse;
}
);
return promise;
};
还要避免使用延迟的 Anti-Pattern。
推荐阅读
- c# - 使用 .NET 4.7.2 项目引用 .NET Standard 2.0 项目 > System.IO.Ports 未实现
- sql - 鉴于其子查询限制,如何在 MS Access 中查询成对事件出席?
- attention-model - 来自 Trax 的 AttentionQKV
- java - 从 groovy 脚本中获取 Spring @Value
- typescript - 替代记录
- tensorflow - 如何将具有不同形状/尺寸的张量相乘?
- php - PHP/MySQL - 基于日期/时间的下一个/上一个按钮,具有重复的日期/时间
- automation - 在 ios 14 快捷方式中自动将图像从电子邮件保存到相册
- ios - Xcode 12 可以与 Xcode 11 共存吗?
- cgal - 带曲线边界的约束 Delaunay 三角剖分