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