Dojo dojo.rawXhrPost 和 dojo.xhrPost

Posted

技术标签:

【中文标题】Dojo dojo.rawXhrPost 和 dojo.xhrPost【英文标题】:Dojo dojo.rawXhrPost and dojo.xhrPost 【发布时间】:2009-12-04 13:25:41 【问题描述】:

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

我一直在尝试使用 Dojo 代码将 JSON 数据发布到 RESTful 服务。似乎 dojo.xhrPostdojo.rawXhrPost 的行为不同,或者更准确地说 rawXhrPost() 有效而 xhrPost() 无效。这与我对docs的阅读不一致

最初的目的 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);

headers: "Content-Type": "application/json" 部分是必需的,以便我的 JAX-RC 服务了解内容是 JSON。

我发现上面的代码运行良好。但是,如果我说:

var deferred = dojo.xhrPost(xhrArgs);

POST 中没有数据传输。我有一个 TCP/IP 监视器,可以看到没有任何传输。

那么,这是一个错误,还是我错误地驱动了 xhrPost()?还是应该使用 rawXhrPost()?如果是后者,我们在什么情况下使用这两种XhrPost?

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢,将进行实验并报告。 我认为您打算使用的字符集是 utf-8 而不是 uft-8。【参考方案2】:

在使用来自 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 Put 请求正文:"postalCode":"h8p3r8","countryCode":"CA"

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

【讨论】:

请您澄清一下 - 您的代码正在使用 xhrPut(),您是否也尝试过使用 xhrPost() ? xhrPost() 和使用“postData”参数传递的数据用作 xhrPut() 和“putData”参数...【参考方案3】:

还有一件事我想添加答案。使用 AJAX 应用程序时,最好将 Accept 值设置为 application/json,如果这是您所期望的。

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

【讨论】:

以上是关于Dojo dojo.rawXhrPost 和 dojo.xhrPost的主要内容,如果未能解决你的问题,请参考以下文章

data-dojo-type 和 dojotype 有啥区别?

DOJO按钮示例[关闭]

Dojo 小部件未正确呈现

在dojo中使用onclick事件刷新页面,我不想刷新页面

如何添加 optgroup do dijit.form.Select 或其他小部件类型

dojo和jquery混合使用