Додзе додзе.rawXhrPost и dojo.xhrPost
мой вопрос: Можем ли мы использовать Dojo.xhrPost для публикации некоторых данных Json? Более подробно:
я экспериментировал с кодом Dojo для публикации данных JSON в Службу RESTful. Кажется, что поведение додзе.xhrPost и додзе.rawXhrPost отличаются, или, если быть более точным, rawxhrpost () работает, а xhrPost () нет. Это не согласуется с моим прочтением docs
первоначальная цель додзе.rawXhrPost был методом, который может использоваться для отправки тела raw post к серверу. Как на 1,3, это функция общего с додзе.xhrPost(). Так, для использования додзе.rawXhrPost (), см. dojo.xhrPost()
что означает, что xhrpost () достаточно. Мой код выглядит так - у меня есть" игрушечная " библиотечная служба, которая управляет изданиями книг. Код хочет опубликовать новую запись,
var myEdition = {"Edition":{"isbn":"44"}};
var xhrArgs = {
url: "http://localhost:8081/LibraryWink/library/editions",
postData: dojo.toJson(myEdition),
handleAs: "json",
headers: { "Content-Type": "application/json"},
load: function(data) {
dojo.byId("mainMessageText").innerHTML = "Message posted.";
},
error: function(error) {
dojo.byId("mainMessageText").innerHTML = "Error :" + error;
}
};
var deferred = dojo.rawXhrPost(xhrArgs);
на заголовки: {"Content-Type": "application/json"} часть необходима, чтобы моя служба JAX-RC понимала, что содержимое является JSON.
Я нахожу, что код выше работает отлично. Однако если вместо этого я скажу:
var deferred = dojo.xhrPost(xhrArgs);
данные в сообщении не передаются. У меня есть монитор TCP/IP на месте и вижу, что ничего не передается.
Итак, это ошибка, или я неправильно управляю xhrPost ()? Или я должен использовать rawXhrPost ()? Если последнее, то при каких обстоятельствах мы используем два аромата XhrPost?
3 ответов
по состоянию на DOJO 1.4 это должно работать:
var myEdition = {"Edition":{"isbn":"44"}};
var xhrArgs = {
url: "http://localhost:8081/LibraryWink/library/editions",
postData: dojo.toJson(myEdition),
handleAs: "json",
headers: { "Content-Type": "application/json"},
load: function(data) {
dojo.byId("mainMessageText").innerHTML = "Message posted.";
},
error: function(error) {
dojo.byId("mainMessageText").innerHTML = "Error :" + error;
}
};
dojo.xhrPost(xhrArgs);
Если вы проводите данные JSON, заголовок Content-Type имеет решающее значение. Если вы не добавите его, браузер по умолчанию будет "application / x-www-form-urlencoded" и URL-адрес закодирует ваши данные для вас.
вы можете добавить кодировку в заголовок Content-Type (я делаю это), но это не мешает ему функционировать:
headers: { "Content-Type": "application/json; charset=utf-8"}
в Firefox 3.6, по крайней мере, кодировка автоматически добавляется.
Как Dom упоминает, эквивалент HTTP PUT-это dojo.xhrPut. Разница здесь в том, что вам нужно добавить данные тела запроса как putData вместо postData.
при использовании библиотеки Dojo из http://ajax.googleapis.com/ajax/libs/dojo/1.3/dojo/dojo.xd.js, у меня нет проблем с публикацией данных из формы (данные сериализованы dojo.formToJson()
).
dojo.xhrPut({
putData: dojo.formToJson("locationInformation"),
handleAs: "json",
load: function(response, ioArgs) {
// ... business logic ...
},
error: function(message, ioArgs) { alert(message+"\nurl: "+ioArgs.url); },
url: "/API/Location"
});
используя Firebug в Firefox, я вижу, что мой запрос построен так, как ожидалось:
- среди других заголовков запроса:
Content-Type = application/json; charset=UTF-8
- тело запроса Put:
{"postalCode":"h8p3r8","countryCode":"CA"}
xhrPost / xhrPut, похоже, работает как rawXhrPost / rawXhrPut...
еще одна вещь, которую я хотел бы добавить ответ. При работе с приложениями AJAX также рекомендуется установить значение Accept в application / json, когда это то, что вы ожидаете.
headers: { "Content-Type": "application/json", "Accept" : "application/json"}