2012-01-06 11 views
5

Per una webapp con un backend RESTful sto postando qualche json al server usando jquery's $post. Ora, con mia sorpresa, il json è inserito in una chiave parametro per i dati del modulo della richiesta, invece che nel corpo della richiesta. Posso pensare ad alcuni other ways to do it, ma la domanda è perché non funziona come mi aspetto.Perché jquery post json come nome parametro anziché come corpo della richiesta?

Sul server che uso scalatra e stampare alcuni richiesta informazioni:

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

Ora un semplice ricciolo che fa quello che penso sia giusto:

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

produce:

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

E il bit di html + js per illustrare il 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} 
============== 

Quindi, se io uso $ post con una stringa JSON in stringa e un callback ho tutto farcite in una sola chiave di parametro. Se questo è normale, mi piacerebbe sapere perché, e come dovrei dipanarlo in modo pulito sul server. Se non è normale, mi piacerebbe sapere cosa dovrei fare per farlo entrare nel corpo della risposta usando $ post.

UPDATE: Ora c'è una feature request for jquery to support contentType on $.post

risposta

8

Penso che si può fare questo se si lascia cadere verso il basso per $.ajax

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

processData dice jquery di non pasticciare con i tuoi dati e l'impostazione contentType dovrebbe garantire che il tuo back-end non prova e analizza l'audio come se fosse una normale forma codificata con l'url.

4

Non si imposta il tipo di contenuto che causa il metodo $ .post() per impostarlo su application/x-www-form-urlencoded.

Utilizzare $ .ajax() e impostare il tipo di contenuto su application/json in modo esplicito.

Saluti, Vincent.

Problemi correlati