2010-06-17 5 views
9

Bei einem Ajax-Aufruf, wenn ContentType auf Anwendung/Json statt der Standard-X-www-Form-urlencoded festgelegt ist, kann Server-Seite (in PHP) die Post-Parameter nicht abrufen.
Im folgenden Arbeitsbeispiel würde PHP $ _POST leer sein, wenn ich in der Ajax-Anfrage den contentType auf "application/json" setze. warum passiert das? Wie kann ich mit einer Anfrage umgehen, bei der contentType application/json in PHP korrekt ist?Handle JSON Anfrage in PHP

$.ajax({ 
    cache: false, 
    type: "POST", 
    url: "xxx.php", 
    //contentType: "application/json", 
    processData: true, 
    data: {my_params:123}, 
    success: function(res) {}, 
    complete: function(XMLHttpRequest, text_status) {} 
}); 

Antwort

25
<?php 
    var_dump(json_decode(file_get_contents('php://input'))); 
?> 
+0

verwenden können ja das funktioniert! der Dump die Anfrage Daten, die ich über POST übergeben – user157195

3

wird Sie unerkannt MIME-Typen in $HTTP_RAW_POST_DATA finden. Sie können PHP auch zwingen, dieses Array immer zu füllen (nicht nur für nicht erkannte MIME-Typen), indem Sie die php.ini-Direktive always_populate_raw_post_data auf true setzen.

Raw Post Daten werden sonst durch den Eingang Wrapper php://input

Für weitere Informationen zur Verfügung: über

http://us.php.net/manual/en/wrappers.php.php

http://php.net/manual/en/reserved.variables.httprawpostdata.php

http://www.php.net/manual/en/ini.core.php#ini.always-populate-raw-post-data

1

ist technisch korrekt, aber da Ich schreibe nicht viel PHP, diese mig ht hilfreicher sein

xxx.php

<?php 
$file = fopen("test.txt","a"); 
$post_json = file_get_contents("php://input"); 
$post = json_decode($post_json, true); 
foreach($post as $key=>$value) { 
    $message = $key . ":" . $value . "\n"; 
    echo fwrite($file,$message); 
} 
fclose($file); 
?> 

sein würde und dann können Sie testen, mit

curl -X POST -H "Content-Type: application/json" -d '{"fieldA":"xyz","fieldN":"xyz"}' http://localhost/xxx.php