2011-08-13 49 views
35

Tôi đang viết một tập lệnh được đăng ký làm điểm cuối cho một webhook. Tôi biết rằng nó đã được đăng ký thành công vì tôi đang viết tiêu đề của mọi yêu cầu vào nhật ký máy chủ của tôi. Dưới đây là một ví dụ:Vấn đề đọc nội dung yêu cầu HTTP từ một POST JSON trong PHP

Content-Type: text/xml; charset=UTF-8 
User-Agent: Jakarta Commons-HttpClient/3.1 
Host: =={obfuscated}== 
Content-Length: 1918 

API mà tôi đã đăng ký đang đăng đối tượng JSON vào tập lệnh của mình và tôi muốn phân tích cú pháp đối tượng đó bằng PHP. Như bạn có thể thấy từ tiêu đề yêu cầu, có một đối tượng JSON chất béo lớn đẹp đang đợi để được phân tích cú pháp. Nó có vẻ đơn giản, nhưng nó đã không được.

Lúc đầu, tôi đã thử sử dụng $_POST['json'] hoặc chỉ $_POST nhưng vì dữ liệu không nằm trong mảng nên tôi không thực sự chắc chắn cách truy cập dữ liệu như vậy.

Tôi đã thử sử dụng file_get_contents('php://input')fopen('php://input', 'r') có và không có json_decode() nhưng không có may mắn. Tôi không thể sử dụng http_get_request_body() vì máy chủ tôi đang sử dụng không có PECL và điều đó nằm ngoài tầm kiểm soát của tôi.

Có cách nào khác để tương tác với đối tượng JSON POST-ed mà tôi đang thiếu không? Cảm ơn!

+1

Loại nội dung cho nội dung JSON sai, do đó có thể đã bị xóa. Nhưng hãy thử ['$ HTTP_RAW_POST_DATA'] (http://php.net/manual/en/reserved.variables.httprawpostdata.php) – mario

+0

@mario Tôi đã thấy biến đó trước đây, nhưng không chắc chắn làm thế nào để sử dụng nó. json_decode ($ HTTP_RAW_POST_DATA); không hoạt động –

+0

Xem trang hướng dẫn sử dụng. Nó cần phải được kích hoạt trong 'php.ini' trước. Bạn cũng đã thử loại MIME chính xác chưa? mod_security được kích hoạt bởi bất kỳ cơ hội nào? – mario

Trả lời

102

Nhờ người khác cho đầu vào. Nó chỉ ra rằng tôi chỉ cần

$inputJSON = file_get_contents('php://input'); 
$input = json_decode($inputJSON, TRUE); //convert JSON into array 

nơi tham số thứ hai trong json_decode trả về đối tượng dưới dạng mảng.

Hy vọng điều này sẽ giúp người khác!

+0

điều này hữu ích, nó cũng hoạt động với tôi –

+5

Làm việc cho tôi. Chỉ không thể tin rằng dữ liệu JSON không được PHP công nhận. Tôi hiểu rằng đó là loại dữ liệu thô sau khi tất cả, nhưng vẫn ... –

+3

'$ _POST' chỉ được điền với các giá trị khi nhận được phần thân yêu cầu với' application/x-www-form-urlencoded' hoặc 'multipart/form- tiêu đề dữ liệu' ** Kiểu nội dung **. Do tính chất luồng của phần thân yêu cầu của PHP, bạn sẽ nhận được dữ liệu trong '$ _POST' *** hoặc *** luồng đầu vào, chứ không phải cả hai. –

Các vấn đề liên quan