2009-12-04 61 views
8

我的问题是:我们可以使用dojo.xhrPost来发布一些Json数据吗?更多详细信息:Dojo dojo.rawXhrPost和dojo.xhrPost

我一直在尝试使用Dojo代码将JSON数据发布到REST风格的服务。它似乎是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); 

头:{“内容类型”:“应用/ JSON”}在必要一部分,这样我的JAX-RC服务的理解是,内容是JSON 。

我发现上面的代码完美地工作。但是,如果我说:

var deferred = dojo.xhrPost(xhrArgs); 

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

那么,这是一个错误,还是我不正确地驾驶xhrPost()?或者我应该使用rawXhrPost()?如果是后者,我们在什么情况下使用XhrPost的两种口味?

回答

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'并且为你编码你的数据。

您可能需要一个字符集添加到Content-Type头(我这样做),但不会停止工作:

headers: { "Content-Type": "application/json; charset=utf-8"} 

在Firefox 3.6至少,字符集自动添加。

由于Dom提到,HTTP PUT等价物是dojo.xhrPut。这里的区别在于,您需要将您的请求主体数据添加为putData而不是postData。

+0

谢谢,我们将进行实验并报告回来。 – djna

+0

我认为你打算使用的字符集是utf-8而不是uft-8。 – Traker

+0

@Tracker:你说得对。它现在已经修复。 – lambacck

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使用萤火虫,我可以看到,如预期我的要求是建立:

  • 在其他请求头:Content-Type = application/json; charset=UTF-8
  • 车身PUT请求的:{"postalCode":"h8p3r8","countryCode":"CA"}

xhrPost/xhrPut似乎像rawXhrPost/rawXhrPut一样工作...

+0

请您澄清一下 - 您的代码使用的是xhrPut(),您是否也尝试过使用xhrPost()? – djna

+0

xhrPost()和通过“postData”参数传递的数据作为xhrPut()和“putData”参数工作... –

2

还有一件事我想补充答案。在使用AJAX应用程序时,将Accept值设置为application/json也是一个不错的主意,当这正是您所期望的。

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