2009-12-04 8 views
8

Mi pregunta es: ¿podemos usar dojo.xhrPost para publicar algunos datos de Json? Más detalles:Dojo dojo.rawXhrPost y dojo.xhrPost

He estado experimentando con el código Dojo para POST JSON datos a un servicio RESTful. Parece ser que los comportamientos de dojo.xhrPost y dojo.rawXhrPost son diferentes, o para ser más precisos rawXhrPost() funciona y xhrPost() no. Esto no es compatible con mi lectura de la docs

El propósito original de dojo.rawXhrPost era un método que podrían utilizarse para enviar un cuerpo posterior prima al servidor. A partir de 1.3, esta función es común con dojo.xhrPost(). Por lo tanto, para el uso de dojo.rawXhrPost(), consulte dojo.xhrPost()

lo que implica que xhrPost() es suficiente. Mi código se ve así: tengo un servicio de biblioteca "de juguete" que administra Ediciones de libros. El código quiere publicar una nueva entrada,

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

Los encabezados: { "Content-Type": "application/json"} parte de lo necesario para que mi servicio JAX-RC entiende que el contenido es JSON .

Lo que encuentro es que el código anterior funciona perfectamente. Sin embargo, si en cambio digo:

var deferred = dojo.xhrPost(xhrArgs); 

No se transmiten datos en la POST. Tengo un monitor TCP/IP en su lugar y puedo ver que no hay nada transmitido.

Entonces, ¿esto es un error, o estoy manejando xhrPost() incorrectamente? ¿O debería usar rawXhrPost()? Si es este último, ¿en qué circunstancias usamos los dos sabores de XhrPost?

Respuesta

13

A partir del DOJO 1.4 el esto debería funcionar:

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

Si envías los datos JSON, la cabecera Content-Type es crítico. Si no lo agrega, el navegador tendrá por defecto 'application/x-www-form-urlencoded' y la URL codificará sus datos por usted.

Es posible que desee añadir un conjunto de caracteres a la cabecera Content-Type (lo hago), pero eso no quiere detener su funcionamiento:

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

En Firefox 3.6, al menos, se añade automáticamente el juego de caracteres.

Como Dom menciona, el HTTP PUT equivalente es dojo.xhrPut. La diferencia aquí es que debe agregar los datos de su cuerpo de solicitud como putData en lugar de postData.

+0

Gracias, experimentarán e informarán. – djna

+0

Creo que el conjunto de caracteres que pretendía usar es utf-8 no uft-8. – Traker

+0

@Tracker: tienes razón. Ahora está arreglado. – lambacck

3

Al utilizar la biblioteca Dojo desde http://ajax.googleapis.com/ajax/libs/dojo/1.3/dojo/dojo.xd.js, no tengo problemas para publicar datos de un formulario (datos serializados por 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 en Firefox, puedo ver que mi solicitud se construye como se esperaba:

  • Entre otras cabeceras de petición: Content-Type = application/json; charset=UTF-8
  • cuerpo de la petición que: {"postalCode":"h8p3r8","countryCode":"CA"}

xhrPost/xhrPut parecen funcionar como rawXhrPost/rawXhrPut ...

+0

favor, ¿podría aclarar - el código está utilizando xhrPut(), ¿ha intentado también con xhrPost()? – djna

+0

xhrPost() y los datos pasados ​​con el parámetro "postData" funcionan como xhrPut() y el parámetro "putData" ... –

2

Una cosa más a la que me gustaría añadir es la respuesta. Cuando trabaje con aplicaciones AJAX, también es una buena idea establecer el valor Aceptar en la aplicación/json cuando eso es lo que está esperando.

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