2009-12-04 3 views
8

La mia domanda è: possiamo usare dojo.xhrPost per pubblicare alcuni dati Json? Ulteriori dettagli:Dojo dojo.rawXhrPost e dojo.xhrPost

Ho sperimentato con il codice Dojo per inviare dati POST JSON a un servizio RESTful. Sembra che i comportamenti di dojo.xhrPost e dojo.rawXhrPost siano diversi, o per essere più precisi rawXhrPost() funziona e xhrPost() no. Ciò non è coerente con la mia lettura del docs

Lo scopo originale di dojo.rawXhrPost era un metodo che potrebbero essere utilizzati per inviare un messaggio corpo grezzo al server. A partire da 1.3, questa funzione è comune con dojo.xhrPost(). Così, per l'utilizzo di dojo.rawXhrPost(), vedere dojo.xhrPost()

il che implica che xhrPost() è sufficiente. Il mio codice è simile a questo: ho un servizio di libreria "giocattolo" che gestisce Editions of Books. Il codice vuole inserire un nuovo ingresso,

 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); 

I intestazioni: { "Content-Type": "application/json"} parte necessaria in modo che il mio servizio JAX-RC capisce che il contenuto è JSON .

Quello che trovo è che il codice sopra funziona perfettamente. Tuttavia se invece dico:

var deferred = dojo.xhrPost(xhrArgs); 

Nessun dato viene trasmesso nel POST. Ho un monitor TCP/IP in atto e posso vedere che non viene trasmesso nulla.

Quindi, questo è un bug o sto guidando xhrPost() in modo errato? O dovrei usare rawXhrPost()? Se quest'ultimo, in quali circostanze usiamo i due sapori di XhrPost?

risposta

13

A partire dal DOJO 1.4 del questo dovrebbe funzionare:

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); 

Se stai scrivendo i dati JSON, l'intestazione Content-Type è critica. Se non lo aggiungi, il browser verrà automaticamente impostato su 'application/x-www-form-urlencoded' e l'URL codificherà i tuoi dati per te.

Si consiglia di aggiungere un set di caratteri per l'intestazione Content-Type (faccio questo), ma questo non interromperne il funzionamento:

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

Su Firefox 3.6, almeno, viene aggiunto automaticamente il charset.

Come dice Dom, l'equivalente PUT HTTP è dojo.xhrPut. La differenza qui è che è necessario aggiungere i dati del corpo della richiesta come putData anziché postData.

+0

Grazie, sperimenterà e riferirà. – djna

+0

Penso che il charset che intendevi usare sia utf-8 not uft-8. – Traker

+0

@Tracker: hai ragione. Ora è risolto. – lambacck

3

Durante l'utilizzo della libreria Dojo da http://ajax.googleapis.com/ajax/libs/dojo/1.3/dojo/dojo.xd.js, non ho problemi a pubblicare dati da un modulo (dati serializzati da 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" 
}); 

Usando Firebug in Firefox, posso vedere che la mia richiesta è costruito come previsto:

  • Tra le altre intestazioni di richiesta: Content-Type = application/json; charset=UTF-8
  • corpo della richiesta Put: {"postalCode":"h8p3r8","countryCode":"CA"}

xhrPost/xhrPut sembra funzionare come rawXhrPost/rawXhrPut ...

+0

Si prega di chiarire: il codice utilizza xhrPut(), l'hai provato anche con xhrPost()? – djna

+0

xhrPost() e i dati passati con il parametro "postData" funzionano come xhrPut() e il parametro "putData" ... –

2

Un'altra cosa che vorrei aggiungere la risposta. Quando lavori con le app AJAX, è anche una buona idea impostare il valore Accept su application/json quando è quello che ti aspetti.

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