file_get_contents (“php: // input”) hoặc $ HTTP_RAW_POST_DATA, cái nào tốt hơn để lấy phần thân của yêu cầu JSON?


120

file_get_contents("php://input")hoặc $HTTP_RAW_POST_DATA- cái nào tốt hơn để lấy phần thân của yêu cầu JSON?

Và tôi nên sử dụng loại yêu cầu nào ( GEThoặc POST) để gửi dữ liệu JSON khi sử dụng phía máy khách XmlHTTPRequest?

Câu hỏi của tôi được lấy cảm hứng từ câu trả lời này: Làm thế nào để đăng JSON sang PHP với curl

Trích dẫn câu trả lời đó:

Từ góc độ giao thức file_get_contents("php://input")thực sự đúng hơn, vì dù sao thì bạn cũng không thực sự xử lý dữ liệu biểu mẫu nhiều phần http.

Câu trả lời:


195

Trên thực tế php://inputcho phép bạn đọc dữ liệu POST thô.

Đây là một giải pháp thay thế ít tốn bộ nhớ hơn cho $ HTTP_RAW_POST_DATA và không cần bất kỳ chỉ thị php.ini đặc biệt nào .

php://inputkhông có sẵn với enctype="multipart/form-data".

Tham khảo: http://php.net/manual/en/wrappers.php.php


12
Ngoài ra, kể từ PHP 5.6, $HTTP_RAW_POST_DATAđược coi là không dùng nữa và php://inputcó thể được sử dụng lại.
Chris Forrence


json_decode (file_get_contents ('php: // input'), true) trong PHP 7.1 có hỗ trợ các giá trị $ _GET từ URL không?
Kailas

$ HTTP_RAW_POST_DATA không được dùng nữa kể từ PHP 7
Daniel

15

php: // input là một luồng chỉ đọc cho phép bạn đọc dữ liệu thô từ phần thân yêu cầu. Trong trường hợp yêu cầu POST, bạn nên sử dụng php: // input thay vì $ HTTP_RAW_POST_DATA vì nó không phụ thuộc vào các chỉ thị php.ini đặc biệt . Hơn nữa, đối với những trường hợp $ HTTP_RAW_POST_DATA không được điền theo mặc định, nó là một giải pháp thay thế có khả năng tốn ít bộ nhớ hơn để kích hoạt always_populate_raw_post_data.

Nguồn: http://php.net/manual/en/wrappers.php.php .


4
Ngoài ra, kể từ PHP 5.6, $HTTP_RAW_POST_DATAđược coi là không dùng nữa và php://inputcó thể được sử dụng lại.
Chris Forrence

14

file_get_contents (php: // input) - lấy dữ liệu POST thô và bạn cần sử dụng dữ liệu này khi viết API và cần đầu vào XML / JSON / ... mà PHP không thể giải mã thành $ _POST một số ví dụ:

gửi qua đường bưu điện chuỗi JSON

<input type="button" value= "click" onclick="fn()">
<script>
 function fn(){


    var js_obj = {plugin: 'jquery-json', version: 2.3};

    var encoded = JSON.stringify( js_obj );

var data= encoded


    $.ajax({
  type: "POST",
  url: '1.php',
  data: data,
  success: function(data){
    console.log(data);
  }

});

    }
</script>

1.php

//print_r($_POST); //empty!!! don't work ... 
var_dump( file_get_contents('php://input'));

3

Các quy tắc thông thường sẽ áp dụng cho cách bạn gửi yêu cầu. Nếu yêu cầu là truy xuất thông tin (ví dụ: một phần kết quả 'gợi ý' tìm kiếm hoặc một trang mới được hiển thị, v.v.), bạn có thể sử dụng GET. Nếu dữ liệu đang được gửi là một phần của yêu cầu thay đổi điều gì đó (cập nhật cơ sở dữ liệu, xóa bản ghi, v.v.) thì hãy sử dụng POST.

Phía máy chủ, không có lý do gì để sử dụng đầu vào thô, trừ khi bạn muốn lấy toàn bộ khối dữ liệu đăng / lấy chỉ trong một lần. Bạn có thể truy xuất thông tin cụ thể mà bạn muốn thông qua mảng _GET / _POST như bình thường. Các thư viện AJAX như MooTools / jQuery sẽ xử lý phần khó thực hiện các lệnh gọi AJAX thực tế và mã hóa dữ liệu biểu mẫu thành các định dạng thích hợp cho bạn.


Đó là vấn đề: tôi muốn lấy toàn bộ bài đăng / khối dữ liệu chỉ trong một lần, vì JSON là một định dạng ít biến đổi, nó chỉ trình bày dữ liệu.
Manuel Bitto

@Kucebe Tôi không hiểu tại sao điều này lại cần thiết, tại sao không đặt dữ liệu JSON vào trường POST và thực hiện với nó?
Pekka

Nếu bạn muốn toàn bộ khối JSON, thì tại sao không gán khối văn bản JSON cho một trường biểu mẫu và gửi nó như vậy? <input type="hidden" name="data" value="json data here" />là hoàn toàn có thể chấp nhận được và cho phép bạn truy xuất nó ở phía máy chủ với $ _REQUEST ['data'].
Marc B

3
Nhúng JSON vào trường POST sẽ làm hỏng mục đích của thẻ kiểu nội dung HTTP và không tốt cho việc gỡ lỗi trong Fiddler và trình gỡ lỗi trình duyệt (có thể hiểu là JSON). Ngoài ra, nhiều thư viện JavaScript của bên thứ 3 ĐĂNG tải trọng JSON dưới dạng ứng dụng / json.
CyberMonk

2

Đối với dữ liệu JSON, việc ĐĂNG nó ở dạng nội dung "ứng dụng / json" dễ dàng hơn nhiều. Nếu bạn sử dụng GET, bạn phải mã hóa URL JSON trong một tham số và nó khá lộn xộn. Ngoài ra, không có giới hạn kích thước khi bạn thực hiện ĐĂNG. Kích thước của GET nếu rất hạn chế (tối đa là 4K).


2
Thường có giới hạn kích thước cho ĐĂNG, nhưng nó thường được đặt khá cao. Kiểm tra của bạn php.ini.
Brad

2

Câu hỏi thứ hai của bạn rất dễ, GET có giới hạn kích thước là 1-2 kilobyte trên cả phía máy chủ và trình duyệt, vì vậy bất kỳ loại dữ liệu nào lớn hơn bạn phải gửi qua POST.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.