Dojo dojo.rawXhrPost и dojo.xhrPost - PullRequest
       12

Dojo dojo.rawXhrPost и dojo.xhrPost

8 голосов
/ 04 декабря 2009

Мой вопрос: можем ли мы использовать 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?

Ответы [ 3 ]

13 голосов
/ 01 февраля 2010

Начиная с 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.

3 голосов
/ 09 декабря 2009

При использовании библиотеки 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
  • Тело заявки на поставку: {"postalCode":"h8p3r8","countryCode":"CA"}

xhrPost / xhrPut, похоже, работает как rawXhrPost / rawXhrPut ...

2 голосов
/ 24 марта 2011

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

headers: { "Content-Type": "application/json", "Accept" : "application/json"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...