Я делаю сообщение http с JQuery 2.0.3 следующим образом:
$.ajax({
type: "POST",
url: "/demo/submitTransactions",
data: JSON.stringify({ ConfirmedTransactions: confirmedTransactions }),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data){alert(data);},
failure: function(errMsg) {
alert(errMsg);
}
});
Json отправляется и записывается на сервере, но success:
ответа success:
и failure:
не включены AFAIK. Код контроллера, который получил json-данные,
@RequestMapping(value = "/submitTransactions", method = RequestMethod.POST, headers = {"content-type=application/json"})
@ResponseBody
@Transactional
public String submitTransactions(@RequestBody @Valid final String string) {
try {
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(filename, true)));
out.println("\n"+string);
out.close();
} catch (IOException e) {
LOGGER.severe("IOException");
e.printStackTrace();
}
LOGGER.info("Received transactions "+string);
return "Received JSON data";
}
Как я могу также сделать успех и неудачу получить обратный вызов, что отправленный json был успешно получен или не был отправлен? Он работает для отправки данных, но ответ с сервера "Received JSON data"
ничего не делает, и нет никакой разницы между этим и методом контроллера, который является void
и просто записывает данные без оператора return
. Можете ли вы предложить улучшение, чтобы javascript, который размещает данные, также получает ответ, который, я полагаю, будет либо статусом 200 OK, либо, возможно, статусом 500 или подобным, если была ошибка сервера?
Согласно ответу @Oleg Estekhin, это должно быть примерно так:
$.ajax({
type: "POST",
url: "/demo/submitTransactions",
data: JSON.stringify({ ConfirmedTransactions: confirmedTransactions }),
contentType: "application/json; charset=utf-8",
dataType: "json"
})
.done(function(data){alert('Done!'+data);})
.fail(function(errMsg) {alert('Failure!'+errMsg);});
Теперь, если я также изменю код контроллера на объект ответа, используя jackson
@RequestMapping (value = "/submitTransactions2", method = RequestMethod.POST, headers = {"content-type = application/json"}) @ResponseBody @Transactional public AccountResponse submitTransactions2 (@RequestBody @Valid final Строка строки) {try {PrintWriter out = new PrintWriter (новый BufferedWriter (новый FileWriter (имя файла, true))); out.println("\n"+string); out.println( "\ п" +string); out.close(); out.close(); } catch (IOException e) { LOGGER.severe("IOException"); } catch (IOException e) {LOGGER.severe("IOException"); e.printStackTrace(); e.printStackTrace(); } LOGGER.info("Received transactions "+string); } LOGGER.info("Полученные транзакции" +string); вернуть новый AccountResponse ("Полученные транзакции", "Получено", "Получено", "Получено"); }
Затем я получаю ответ "Готово!". с сервера (но я получаю ответ "сбой" при использовании только строки и без джексона.
После обновления в соответствии со вторым ответом это изменение работает:
$.ajax({
type: "POST",
url: "/demo/submitTransactions",
data: JSON.stringify({ ConfirmedTransactions: confirmedTransactions }),
contentType: "application/json; charset=utf-8",
dataType: "text"
})
.done(function(data){alert('Done!'+data);})
.fail(function(errMsg) {alert('Failure!'+errMsg);});
Оно работает. ives tha возвратил String
,
Как указано в ответе Олега Эстехина, правильная собственность для использования - это error
. Также вы должны использовать варианты обещаний:
$.ajax({ ... })
.done(...)
.fail(...);
Затем вы должны изменить dataType
на text
чтобы jQuery знал, что возвращаемое значение должно анализироваться как обычный текст, а не как JSON. Это приведет к вызову обратного вызова успеха. Окончательный код будет выглядеть следующим образом:
$.ajax({
type: "POST",
url: "/demo/submitTransactions",
data: JSON.stringify({ ConfirmedTransactions: confirmedTransactions }),
contentType: "application/json; charset=utf-8",
dataType: "text"
})
.done(function(data){alert(data);})
.fail(function(errMsg) {alert(errMsg);})
;
Во-первых, для документации jQuery ajax свойство, содержащее обратный вызов отказа, называется "ошибкой", поэтому ваш пример должен выглядеть так:
$.ajax({
// other properties
success: function(data){alert(data);},
error: function(errMsg) {alert(errMsg);}
});
Во-вторых, "успешный", "ошибочный" и "полный" обратные вызовы считаются устаревшими с jQuery 1.8, и вы должны использовать варианты в стиле обещаний:
$.ajax({
// other properties
})
.done(function(data){alert(data);})
.fail(function(errMsg) {alert(errMsg);});