2012-03-01 18 views
6

Sto tentando di inviare dati JSON da un modulo utilizzando l'oggetto XMLHttpRequest. Posso inviare i dati usando la seguente funzione. Non ci sono errori visualizzati in FireBug e i dati JSON nella richiesta vengono visualizzati ben formati da FireBug.Invia dati JSON a PHP utilizzando XMLHttpRequest senza jQuery

Tuttavia, ho inviare i dati a echo.php, ciò che restituisce semplicemente il contenuto:

<?php 
print_r($_POST); 
print_r($_GET); 
foreach (getallheaders() as $name => $value) { 
    echo "$name: $value\n"; 
} 
echo file_get_contents('php://input'); 
?> 

Il POST-array è sempre vuoto, ma posso vedere la stringa JSON restituita da file_get_contents. Come succede? Che cosa sto facendo di sbagliato?

uscita del echo.php

Array 
(
) 
Array 
(
) 
Host: localhost 
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: eo,de-de;q=0.8,de;q=0.6,en-us;q=0.4,en;q=0.2 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Content-Type: application/json; charset=utf-8 
Referer: http://localhost/form.html 
Content-Length: 88 
Cookie: {{..to much data..}} 
Pragma: no-cache 
Cache-Control: no-cache 
{"type":"my_type","comment":"commented"} 

la funzione di invio:

function submit(){ 
    var data={}; 
    data.type=document.form.type.value; 
    data.comment=document.form.comment.value; 

    //get right XMLHttpRequest object for current browsrer 
    var x=ajaxFunction(); 

    var string = JSON.stringify(data); 

    x.open('POST','echo.php',true); 
    x.setRequestHeader('Content-type','application/json; charset=utf-8'); 
    x.setRequestHeader("Content-length", string.length); 
    x.setRequestHeader("Connection", "close"); 

    x.onreadystatechange = function(){ 
     if (x.readyState != 4) return; 
     if (x.status != 200 && x.status != 304) { 
      alert('HTTP error ' + req.status); 
      return; 
     } 

     data.resp = JSON.parse(x.responseText); 
     if(data.resp.status=='success'){ 
      alert('That worked!'); 
     }else{ 
      alert('That didn\'t work!'); 
     } 
    } 
    x.send(string); 

    return false; //prevent native form submit 
} 
+0

'avviso ('errore HTTP' + req.status);' ==> req non definito, intendevi invece 'x'? –

risposta

7

ti sei dimenticato di nominare le variabili della funzione di invio. Il buon modo per usarlo è

x.send('name1='+string+'&name2=value2'); 

Dato che, penso che si dovrà cambiare l'intestazione content-length. Non penso sia utile inviarlo.

Un'altra cosa che puoi fare è provare con il metodo GET. Si può anche provare a cambiare l'intestazione del tipo di contenuto da quella:

xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded") 
+0

già provato, ma non modifica il comportamento. Ricevo 'data = {" type ":" my_type "," comment ":" commentato "}' in PHP, ma '$ _POST' è vuoto. Devo sfuggire alla stringa? Come? – Simon

+1

Una cosa che puoi fare è sostituire l'intestazione del tipo di contenuto con quella: x.setRequestHeader ("Content-type", "application/x-www-form-urlencoded") – artragis

+0

Grazie! Ha funzionato! Sembra molto strano per me. Ma se è l'unico modo, lo farò in questo modo. – Simon

5

PHP non elabora automaticamente le richieste di JSON come fa con le richieste di forma codificata o più parti. Se vuoi usare JSON per inviare richieste a PHP, lo stai facendo in modo corretto con file_get_contents(). Se vuoi unire queste variabili al tuo oggetto $ _POST globale puoi, anche se non consiglierei di farlo perché potrebbe confondere gli altri sviluppatori.

// it's safe to overwrite the $_POST if the content-type is application/json 
// because the $_POST var will be empty 
$headers = getallheaders(); 
if ($headers["Content-Type"] == "application/json") 
    $_POST = json_decode(file_get_contents("php://input"), true) ?: []; 

Nota rapida: non si dovrebbe inviare un set di caratteri con Content-Type per applicazione/json. Questo dovrebbe essere inviato solo con text/* Content-Types.

Problemi correlati