Dojo dojo.rawXhrPost和dojo.xhrPost

时间:2009-12-04 13:25:41

标签: json dojo

我的问题是:我们可以使用dojo.xhrPost发布一些Json数据吗?更多细节:

我一直在尝试使用Dojo代码将JSON数据POST到RESTful服务。似乎 dojo.xhrPost dojo.rawXhrPost 的行为不同,或者更准确的rawXhrPost()工作,而xhrPost()则不行。这与我对docs

的阅读不一致
  

最初的目的   dojo.rawXhrPost是一种方法   可以用来发送一个原始的邮政体   到服务器。截至1.3,这个   功能很常见   dojo.xhrPost()。所以,对于使用   dojo.rawXhrPost(),请参阅dojo.xhrPost()

这意味着xhrPost()就足够了。我的代码看起来像这样 - 我有一个管理Editions of Books的“玩具”图书馆服务。代码想要POST一个新条目,

        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 个答案:

答案 0 :(得分:13)

从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。

答案 1 :(得分:3)

在使用http://ajax.googleapis.com/ajax/libs/dojo/1.3/dojo/dojo.xd.js中的Dojo库时,我没有问题从表单发布数据(由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"
});

在Firefox中使用Firebug,我可以看到我的请求是按预期构建的:

  • 在其他请求标头中:Content-Type = application/json; charset=UTF-8
  • 投放请求的正文:{"postalCode":"h8p3r8","countryCode":"CA"}

xhrPost / xhrPut似乎可以作为rawXhrPost / rawXhrPut ...

答案 2 :(得分:2)

我还想补充一点答案。使用AJAX应用程序时,最好将Accept值设置为application / json,这是您所期望的。

headers: { "Content-Type": "application/json", "Accept" : "application/json"}