2012-01-06 5 views
5

Para una aplicación web con un back-end RESTful estoy publicando algunos json en el servidor usando jquery's $post. Ahora, para mi sorpresa, el json está rellenado en una clave de parámetro para los datos del formulario de la solicitud, en lugar de en el cuerpo de la solicitud. Puedo pensar en algunos other ways to do it, pero la pregunta es por qué no funciona como esperaba.¿Por qué jquery publica json como un nombre de parámetro en lugar de como el cuerpo de la solicitud?

En el servidor que utilizo scalatra y alguna información de solicitud:

println("Request received:") 
println(fromInputStream(request.getInputStream).getLines().mkString) 
println("--------------") 
println(request.getParameterMap.toString) 
println("==============") 

Ahora un rizo simple que hace lo que yo creo es correcto:

curl -X POST http://localhost:8080/x -H "Content-Type: application/json" -d '{"a":"b"}' 

Produce:

Request received: 
{"a":"b"} 
------------- 
{} 
============== 

Y el bit de html + js para ilustrar el problema:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> 
<body> 
    <button type="button" onclick="doPost()"> 
    POST 
    </button> 
    <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script> 
    <script type="text/javascript"> 
function doPost() { 
    $.post("http://localhost:8080/x",  
      JSON.stringify({"a":"b"}), 
      function(data) {}); 
} 
    </script> 
</body> 
</html> 

Produce:

Request received: 

-------------- 
{{"a":"b"}=[Ljava.lang.String;@7a2897ac} 
============== 

Así que si uso $ post con una cadena JSON stringified y una devolución de llamada consigo todo metido en una sola tecla de parámetros. Si esto es normal, me gustaría saber por qué, y cómo se supone que debo desentrañar esto limpiamente en el servidor. Si no es normal, me gustaría saber qué debo hacer para obtenerlo en el cuerpo de respuesta usando $ post.

ACTUALIZACIÓN: Ahora hay un feature request for jquery to support contentType on $.post

Respuesta

8

Creo que se puede hacer esto si se le cae hacia abajo para $.ajax

$.ajax(
    { 
    url: "http://localhost:8080/x", 
    data: JSON.stringify({a: 'b'}), 
    processData: false, 
    type: 'POST', 
    contentType: 'application/json' 
    } 
); 

processData dice jQuery para no perder el tiempo con sus datos y el establecimiento de contentType debe garantizar que tu backend no intenta analizar el json como si fuera una forma codificada en url normal.

4

No está configurando el tipo de contenido que está causando que el método $ .post() lo configure en application/x-www-form-urlencoded.

Utilice $ .ajax() y establezca el tipo de contenido explícitamente en application/json.

Saludos, Vincent.

Cuestiones relacionadas