我的问题是:我们可以使用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的两种风格?
答案 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"}