我的问题是:我们可以使用dojo.xhrPost发布一些Json数据吗?更多详情:
我一直在尝试使用Dojo代码将JSON数据POST到RESTful服务.似乎dojo.xhrPost和dojo.rawXhrPost的行为是不同的,或者更准确的rawXhrPost()起作用而xhrPost()不起作用.这与我对文档的阅读不一致
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);
该头:{"内容类型":"应用/ JSON"}中不可或缺的一部分,使我的JAX-RC服务的理解是,内容是JSON.
我发现上面的代码完美无缺.但是如果相反我说:
var deferred = dojo.xhrPost(xhrArgs);
POST中没有数据传输.我有一个TCP/IP监视器,可以看到没有任何传输.
那么,这是一个错误,还是我错误地驾驶xhrPost()?或者我应该使用rawXhrPost()?如果是后者,我们在什么情况下使用XhrPost这两种口味?
从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上,会自动添加charset.
正如Dom所提到的,HTTP PUT等价物是dojo.xhrPut.这里的区别在于您需要将请求正文数据添加为putData而不是postData.