我有一个AngularJS前端调用app-service,只返回一些虚拟数据。
应用程序间歇性地在此调用失败,我无法解决原因。我在Spring REST服务中“登录”(到控制台),这表明这里没有问题。我已经改变了一点,以尽可能多地检查。它返回一个org.springframework.http.ResponseEntity对象
//Service controller
@RequestMapping(value = "/person", method = RequestMethod.POST)
public ResponseEntity<Long> createPerson(@RequestBody Person person) {
System.out.println("Service Layer - Creating Person");
Long newPersonId = personService.createPerson(person);
System.out.println("Created new Person: " + Long.toString(newPersonId));
ResponseEntity<Long> x = new ResponseEntity<Long> (newQuestionId, HttpStatus.OK);
System.out.println("return code: " + x.getStatusCode().toString());
return x;
}
每次都没有问题!在返回成功和新Id之前成功或失败最后一个输出。此外,创建将保存到内存(Tomcat),当我刷新并返回列表页面时,已创建Person。
我在AngularJS中遇到了问题。 AngularJS服务接收返回代码的方式存在间歇性。我一遍又一遍地看着它,尝试了各种不同的东西,但我无法深究它。这可能不是下面的信息,所以如果你愿意帮我们告诉我你还需要什么。
我从
开始//Post Question
factory.createQuestion = function (question) {
return $http.post(serviceBase + 'question/' , question).then(
function (response) {
alert ("X1");
alert ("X3: " + response.status);
newQuestionId = response.data;
return response.data;
})
};
此代码经常被忽略。我改为使用.success和.error认为这是方式,但@Duncan告诉我,我有错误的方法(感谢信息!)
我在这里包含了这个,因为它产生了一个有趣的结果
//JS Service
factory.createPerson = function (person) {
return $http.post('serviceurl/person' , person).success
(
function (response) {
newPersonId = response.data;
return response.data;
}).error(function(http, status) {
alert ('error');
alert ('status:' + status);
});
};
结果是状态始终为-1。当我将帖子更改为put
时$http.post('serviceurl/person'...
我得到了405错误(因为它不存在)。这让我想知道AngularJS服务和Spring ResponseEntity对象是否没有通信?
我想知道是否会出现这种情况(这就是我将Spring添加到标签中的原因),我认为我现在正在做的一切正常吗?我想尽管我的问题非常基本但我希望 - 有人能告诉我如何获得有关错误的良好信息。如果我使用.then(),我得不到它为什么会失败的信息?!
为了完整性,这是AngularJS控制器...
//JS Controller
$scope.submitPersonData = function () {
personService.createPerson($scope.person)
.then(function (newPersonId) {
$location.path('/people');
});
};
答案 0 :(得分:2)
$http
.success
承诺返回data, status, headers, config
。以该顺序。我不知道你从哪里获得http, status, fnc, httpObj
。但是你不应该使用.success
或.error
;请改用.then
。所以它是这样的:
$http.post('/path/to/api', person).then(function(response) {
//http 200 resolved
//get http status from response.status
//get data from response.data
}, function(response) {
//an error has occurred. get details from data
//get http status from response.status
//get data from response.data
});
你真正应该做的是在api中,你应该在你认为服务失败的地方添加一个try / catch。我不太了解java ...但这就是你在C#中的表现:
[HttpPost]
public JsonResult CreatePerson(Person person)
{
PersonService service = new PersonService(person);
Dictionary<string, object> returnMessage = new Dictionary<string, object>();
try
{
long newPersonId = service.CreatePerson();
returnMessage.Add("message", "success");
returnMessage.AdD("newPersonId", newPersonId);
}
catch (Exception exc)
{
returnMessage.Add("message", "error");
returnMessage.Add("details", exc.Message);
}
return Json(returnMessage);
}