2010-06-17 56 views
9

Khi thực hiện cuộc gọi ajax, khi contentType được đặt thành ứng dụng/json thay vì mặc định x-www-form-urlencoded, phía máy chủ (bằng PHP) không thể nhận được thông số bài đăng.
trong ví dụ làm việc sau đây, nếu tôi đặt contentType thành "application/json" trong yêu cầu ajax, PHP $ _POST sẽ trống. lý do tại sao điều này xảy ra? Làm thế nào tôi có thể xử lý một yêu cầu mà contentType là ứng dụng/json đúng trong PHP?xử lý yêu cầu json trong 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) {} 
}); 

Trả lời

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

vâng, điều này có hiệu quả! kết xuất dữ liệu yêu cầu mà tôi đã chuyển qua POST – user157195

3

Bạn sẽ tìm thấy các loại MIME không được công nhận trong $HTTP_RAW_POST_DATA. Bạn cũng có thể buộc PHP luôn điền vào mảng này (không chỉ cho các loại MIME không được nhận dạng) bằng cách đặt chỉ thị php.ini always_populate_raw_post_data thành true.

Raw bài dữ liệu khác sẽ được cung cấp thông qua các wrapper đầu vào php://input

Để biết thêm thông tin:

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

trên là chính xác về mặt kỹ thuật, nhưng vì Tôi không viết nhiều PHP, ht thể hữu ích hơn

xxx.php sẽ

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

và sau đó bạn có thể kiểm tra với

curl -X POST -H "Content-Type: application/json" -d '{"fieldA":"xyz","fieldN":"xyz"}' http://localhost/xxx.php 
Các vấn đề liên quan