file_get_contents ("php: // input") veya $ HTTP_RAW_POST_DATA, JSON isteğinin gövdesini almak için hangisi daha iyidir?


120

file_get_contents("php://input")veya $HTTP_RAW_POST_DATA- JSON isteğinin gövdesini almak için hangisi daha iyidir?

İstemci tarafını kullanırken JSON verilerini göndermek için hangi istek türünü ( GETveya POST) kullanmalıyım XmlHTTPRequest?

Sorum şu cevaptan ilham aldı: JSON'u PHP'ye curl ile nasıl gönderebilirim?

Bu cevaptan alıntı yapın:

Protokol açısından bakıldığında file_get_contents("php://input")aslında daha doğrudur, çünkü zaten http çok parçalı form verilerini gerçekten işlemiyorsunuz.

Yanıtlar:


196

Aslında php://inputham POST verilerini okumanıza izin verir.

$ HTTP_RAW_POST_DATA'ya göre daha az bellek yoğun bir alternatiftir ve herhangi bir özel php.ini yönergesine ihtiyaç duymaz .

php://inputile kullanılamaz enctype="multipart/form-data".

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


12
Ek olarak, PHP 5.6'dan itibaren $HTTP_RAW_POST_DATAkullanımdan kaldırılmış kabul edilir ve php://inputyeniden kullanılabilir.
Chris Forrence

Ayrıca bakınız enable_post_data_reading.
Pacerier

json_decode (file_get_contents ('php: // input'), true) bu PHP 7.1'de URL'den $ _GET değerlerini almayı destekliyor mu?
Kailas

$ HTTP_RAW_POST_DATA, PHP 7
Daniel

15

php: // girdi bir olan salt okunur istek vücuttan ham verileri okumak için izin verir akışı. POST istekleri durumunda , özel php.ini yönergelerine bağlı olmadığı için $ HTTP_RAW_POST_DATA yerine php: // input kullanılması tercih edilir . Üstelik, $ HTTP_RAW_POST_DATA'nın varsayılan olarak doldurulmadığı durumlar için, always_populate_raw_post_data'yı etkinleştirmeye kıyasla daha az bellek yoğun bir alternatiftir.

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


4
Ek olarak, PHP 5.6'dan itibaren $HTTP_RAW_POST_DATAkullanımdan kaldırılmış kabul edilir ve php://inputyeniden kullanılabilir.
Chris Forrence

14

file_get_contents (php: // girişi) - ham POST verilerini alır ve size API'leri ve yazarken bu kullanmak gerekir ihtiyaç XML / JSON / ... PHP ile $ _POST için deşifre edilemeyen girdi bazı örnek:

sonrası JSON dizesi ile gönder

<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

İsteği nasıl göndereceğinize ilişkin olağan kurallar geçerli olmalıdır. Talep bilgi almaksa (örneğin, kısmi bir arama 'ipucu' sonucu veya görüntülenecek yeni bir sayfa, vb.) GET'i kullanabilirsiniz. Gönderilen veriler bir şeyi değiştirme isteğinin parçasıysa (bir veritabanını güncelleme, bir kaydı silme, vb.) POST'u kullanın.

Sunucu tarafında, tüm postayı / veri bloğunu tek seferde almak istemediğiniz sürece, ham girişi kullanmak için hiçbir neden yoktur. İstediğiniz belirli bilgileri _GET / _POST dizileri aracılığıyla her zamanki gibi alabilirsiniz. MooTools / jQuery gibi AJAX kitaplıkları, gerçek AJAX çağrılarını yapmanın ve form verilerini sizin için uygun formatlara kodlamanın zor kısmını halledecektir.


Mesele şu: Tüm postayı / veri bloğunu tek seferde almak istiyorum, çünkü JSON değişkensiz bir formattır, sadece veriyi sunar.
Manuel Bitto

@Kucebe Bunun neden gerekli olduğunu anlamıyorum, neden JSON verilerini bir POST alanına koyup onunla yapılmayalım?
Pekka

JSON bloğunun tamamını istiyorsanız, o zaman neden JSON metin bloğunu bir form alanına atayıp bu şekilde göndermiyorsunuz? <input type="hidden" name="data" value="json data here" />tamamen kabul edilebilir ve $ _REQUEST ['data'] ile önemsiz bir şekilde sunucu tarafında almanızı sağlar.
Marc B

3
JSON'u bir POST alanına gömmek, HTTP içerik türü etiketinin amacını bozar ve Fiddler'da ve tarayıcı hata ayıklayıcılarında (JSON'u anlayabilen) hata ayıklama için o kadar iyi değildir. Ayrıca, birçok 3. parti JavaScript kitaplığı, application / json olarak POST JSON yüklerini.
CyberMonk

2

JSON verileri için, "uygulama / json" içerik türü olarak POST yapmak çok daha kolaydır. GET kullanıyorsanız, JSON'yi bir parametrede URL olarak kodlamanız gerekir ve bu biraz karmaşıktır. Ayrıca, POST yaptığınızda boyut sınırı yoktur. GET'in boyutu çok sınırlıysa (en fazla 4K).


2
POST için genellikle bir boyut sınırı vardır, ancak genellikle oldukça yüksek bir değere ayarlanır. Kontrol edin php.ini.
Brad

2

İkinci sorunuz kolay, GET'in hem sunucu hem de tarayıcı tarafında 1-2 kilobaytlık bir boyut sınırlaması vardır, bu nedenle POST yoluyla göndermeniz gereken her türden daha büyük miktarda veri.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.