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.xhrPost 和 dojo.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 有啥区别?