Додзе додзе.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"}