Додзё dojo.rawXhrPost и dojo.xhrPost

Мой вопрос: можем ли мы использовать dojo.xhrPost для публикации некоторых данных Json? Подробнее:

Я экспериментировал с кодом Dojo для отправки данных JSON в службу RESTful. Похоже, что поведение dojo.xhrPost и dojo.rawXhrPost отличается, или, если быть более точным, rawXhrPost() работает, а xhrPost() — нет. Это не согласуется с моим прочтением документов.

Первоначальной целью dojo.rawXhrPost был метод, который можно было использовать для отправки необработанного тела сообщения на сервер. Начиная с версии 1.3, эта функция является общей для dojo.xhrPost(). Итак, для использования dojo.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);

В POST данные не передаются. У меня установлен монитор TCP/IP, и я вижу, что ничего не передается.

Итак, это ошибка, или я неправильно использую xhrPost()? Или мне следует использовать rawXhrPost()? Если второе, то при каких обстоятельствах мы используем две разновидности XhrPost?


person djna    schedule 04.12.2009    source источник


Ответы (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 кодировка добавляется автоматически.

Как упоминает Дом, HTTP-эквивалентом PUT является dojo.xhrPut. Разница здесь в том, что вам нужно добавить данные тела запроса как putData вместо postData.

person lambacck    schedule 31.01.2010
comment
Спасибо, поэкспериментирую и отчитаюсь. - person djna; 01.02.2010
comment
Я думаю, что кодировка, которую вы хотели использовать, это utf-8, а не uft-8. - person Traker; 22.09.2011

При использовании библиотеки 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...

person Dom Derrien    schedule 09.12.2009
comment
Пожалуйста, не могли бы вы уточнить - ваш код использует xhrPut(), вы также пробовали его с xhrPost()? - person djna; 09.12.2009
comment
xhrPost() и данные, переданные с параметром postData, работают как xhrPut(), а параметр putData... - person Dom Derrien; 04.05.2010

Еще одна вещь, которую я хотел бы добавить к ответу. При работе с приложениями AJAX также рекомендуется установить для параметра Accept значение application/json, если это то, что вы ожидаете.

headers: { "Content-Type": "application/json", "Accept" : "application/json"}
person Richard Ayotte    schedule 24.03.2011