2010-06-17 6 views
9

Lors d'un appel ajax, lorsque contentType est défini sur application/json au lieu de x-www-form-urlencoded par défaut, le côté serveur (en PHP) ne peut pas obtenir les paramètres post.
Dans l'exemple de travail suivant, si je définissais contentType sur "application/json" dans la requête ajax, PHP $ _POST serait vide. Pourquoi cela arrive-t-il? Comment puis-je gérer une requête où contentType est application/json correctement en PHP?gérer la requête json en 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) {} 
}); 

Répondre

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

oui cela fonctionne! le vidage des données de la demande que j'ai passé via POST – user157195

3

Vous trouverez des types MIME non reconnus dans $HTTP_RAW_POST_DATA. Vous pouvez également forcer PHP à toujours remplir ce tableau (pas seulement pour les types MIME non reconnus) en définissant la directive php.ini always_populate_raw_post_data sur true.

des données brutes POST seront par ailleurs disponibles dans l'emballage d'entrée php://input

Pour plus d'informations:

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

ci-dessus est techniquement correct, mais étant donné que Je n'écris pas beaucoup PHP, cette mig ht être plus utile

xxx.php serait

<?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); 
?> 

et vous pouvez tester avec

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