PHP ile JSON POST alın


292

Bir ödeme arayüzü web sitesinde bir JSON POST almaya çalışıyorum, ancak kodunu çözemiyorum.

Yazdırdığımda:

echo $_POST;

Alırım:

Array

Bunu denediğimde hiçbir şey almıyorum:

if ( $_POST ) {
    foreach ( $_POST as $key => $value ) {
        echo "llave: ".$key."- Valor:".$value."<br />";
    }
}

Bunu denediğimde hiçbir şey almıyorum:

$string = $_POST['operation'];
$var = json_decode($string);
echo $var;

Bunu denediğimde NULL alıyorum:

$data = json_decode( file_get_contents('php://input') );
var_dump( $data->operation );

Ben yaparken:

$data = json_decode(file_get_contents('php://input'), true);
var_dump($data);

Alırım:

NULL

JSON biçimi (ödeme sitesi belgelerine göre):

{
   "operacion": {
       "tok": "[generated token]",
       "shop_id": "12313",
       "respuesta": "S",
       "respuesta_details": "respuesta S",
       "extended_respuesta_description": "respuesta extendida",
       "moneda": "PYG",
       "monto": "10100.00",
       "authorization_number": "123456",
       "ticket_number": "123456789123456",
       "response_code": "00",
       "response_description": "Transacción aprobada.",
       "security_information": {
           "customer_ip": "123.123.123.123",
           "card_source": "I",
           "card_country": "Croacia",
           "version": "0.3",
           "risk_index": "0"
       }
    }
}

Ödeme sitesi günlüğü her şeyin yolunda olduğunu söylüyor. Sorun ne?


4
Ne var_dump($_POST)diyor? Boş bir dizi mi?
Sergiu Paraschiv

3
$ _POST, "&" ayrılmış gönderi isteği sözlüğüne sahiptir. Json için $ _POST KESİNLİKLE çalışmaz. File_get_contents ('php: // input') yazdırabilir misiniz? Ayrıca var_dump ($ data-> operasyonu); veya var_dump ($ data-> operacion); ?
Akshaya Shanbhogue 18:13

4
JSON metindir, POST'ta neden erişilemez? Ödeme hizmeti, bu metni PHP uç noktasına POST ettiğinde json_decodebunu yapabilmelidir . Ama belki de hizmet istek gövdesinde veri gönderir , bu farklı bir hikaye ve evet, file_get_contents('php://input')o zaman çalışmalıdır.
Sergiu Paraschiv

1
Eğer öyleyse, o zaman burada tartışılmıştır: stackoverflow.com/questions/8945879/…
Sergiu Paraschiv

3
$ _POST: İstekte HTTP Content-Type olarak application / x-www-form-urlencoded veya multipart / form-data kullanılırken , geçerli komut dosyasına HTTP POST yöntemi aracılığıyla iletilen ilişkilendirilebilir değişken dizisi . Application / json kullanırken değil.
Cristian Sepulveda

Yanıtlar:


477

Deneyin;

$data = json_decode(file_get_contents('php://input'), true);
print_r($data);
echo $data["operacion"];

Json'unuzdan ve kodunuzdan, işlemin sonunda doğru bir şekilde hecelediğiniz anlaşılıyor, ancak json'da değil.

DÜZENLE

Belki de php: // girişinden json dizesini yankılamaya çalışmaya değer.

echo file_get_contents('php://input');

2
Merhaba Her iki durumda da ekranda hiçbir şey
almıyorum

6
Değer için, İspanyolca İspanyolca yazım (vurgu veya vurgu).
Patrick

11
Amacı, onu her iki yerde de doğru şekilde hecelememiş olmasıydı.
12j13

2
PHP 5.6'dan önce, php: // girişinin içeriğinin alınması sadece bir kez yapılabilir. Kodunuz veya çerçeveniz daha önce bir yerde açabilir mi?
aljo f

90

Parametrelerinizi örneğin $ _POST ['eg'] gibi ayarladıysanız ve değiştirmek istemiyorsanız, bunu şu şekilde yapın:

$_POST = json_decode(file_get_contents('php://input'), true);

Bu, tüm $ _POST'u başka bir şeye değiştirme zahmetinden kurtaracak ve bu satırı çıkarmak isterseniz yine de normal posta istekleri yapmanıza izin verecektir.


1
Teşekkürler bayım. Android benim PHP json gönderme yapıyorum Bu benim durumumda çalıştı!
18'de vanurag

Teşekkürler, benim durumumda işe yaradı. $ _POST verilerini bir $ request değişkenine ataıyordum, şimdi sadece bu değişkene php: // input'un içeriğini atadım.
Funder

Bu benim günümü çok daha kolay hale getirdi. Teşekkürler.
Tyler Mammone

47

Bu kullanırsanız belirtmekte fayda olduğunu json_decode(file_get_contents("php://input"))(diğerleri söylediğim gibi) dize ise, bu başarısız olur değil geçerli JSON.

Bu, önce JSON'un geçerli olup olmadığını kontrol ederek basitçe çözülebilir. yani

function isValidJSON($str) {
   json_decode($str);
   return json_last_error() == JSON_ERROR_NONE;
}

$json_params = file_get_contents("php://input");

if (strlen($json_params) > 0 && isValidJSON($json_params))
  $decoded_params = json_decode($json_params);

Düzenleme: çıkarmadan o Not strlen($json_params)yukarıdaki gibi ince hatalara neden olabilir json_last_error()gelmez değil zamanı değiştirmek nullboş dize geçirilir veya burada gösterildiği gibi,: http://ideone.com/va3u8U


2
Birisi girişte oldukça büyük miktarda veri ve / veya yüksek miktarda istek bekliyorsa, işlevi isteğe bağlı olarak sağlanan değişken başvurusunu json_decode sonucuyla doldurmak için genişletmek isteyebilir, böylece ayrıştırma işlemine gerek kalmaz iyi biçimlendirilmiş girdi üzerinde iki kez gerçekleştirilmelidir.
faintsignal

4
Bu şekilde yapılır, aslında json'u iki kez çözersiniz. Bu pahalı. İlk kod çözme ile, kodu çözülen değeri hemen kaydedebilir, daha sonra bunu kontrol edebilirsiniz (json_last_error () == JSON_ERROR_NONE) ve sonra her şey
yolundaysa

@kakoma, kesinlikle! Bu basitlik düşünülerek yazılmıştır. Eğitim amacıyla, sadelik genellikle verimlilikten daha önemlidir. :)
XtraSimplicity

1
Doğru. Eğitim amaçlı. @XtraSimplicity Ha açıklama için teşekkürler, hatta sizin adınıza :-)
kakoma

37

Yerine $HTTP_RAW_POST_DATAkullanın $_POST.

Size olduğu gibi POST verileri verecektir.

Daha json_decode()sonra kullanarak kodunu çözebileceksiniz .


45
$ HTTP_RAW_POST_DATA artık amortismana tabi tutulduğundan JSON POST$json = file_get_contents('php://input'); $obj = json_decode($json);
Bikal Basnet

2
Benim için bu yaygın cevap [$ json = file_get_contents ('php: // input') kullanın; ] Ben JSON dış çoğu "konteyner karakterleri" [] olarak gönderilirken işe yaramadı görüyordu. Burada RAW_POST_DATA ile bu cevap benim için hile yaptı. Ve benim mevcut PHP yığını ile gayet iyi. Bir süre takılıp kaldım .. Bu çözüm için çok teşekkürler!
Gene Bo

Bu hala oldukça güncel, GitLab web kancaları için (örneğin), hala kullanmanız gerekiyor $HTTP_RAW_POST_DATA.
developius

Bir çözüm aradım ve Bikel Basnet seninki benim için çalıştı. Teşekkürler!
Scooter

uygulama / json: Bu benim 3 gün tip Content-Type ile bir istek göndererek bir HttpClient açısal 2'nin gelen POST değişkenlerini yakalamak için yollar aramaya kurtardı
Frederick G. Sandalo


8
$data = file_get_contents('php://input');
echo $data;

Bu benim için çalıştı.


-5

İçeriği almak için curl ve sonuçları bir pdf'ye kaydetmek için mpdf kullanan bir cevap göndermek istiyorum , böylece tipik bir kullanım durumunun tüm adımlarını elde edersiniz. Bu sadece ham kod (böylece ihtiyaçlarınıza göre uyarlanabilir), ama işe yarıyor.

// import mpdf somewhere
require_once dirname(__FILE__) . '/mpdf/vendor/autoload.php';

// get mpdf instance
$mpdf = new \Mpdf\Mpdf();

// src php file
$mysrcfile = 'http://www.somesite.com/somedir/mysrcfile.php';
// where we want to save the pdf
$mydestination = 'http://www.somesite.com/somedir/mypdffile.pdf';

// encode $_POST data to json
$json = json_encode($_POST);

// init curl > pass the url of the php file we want to pass 
// data to and then print out to pdf
$ch = curl_init($mysrcfile);

// tell not to echo the results
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1 );

// set the proper headers
curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Content-Length: ' . strlen($json) ]);

// pass the json data to $mysrcfile
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);

// exec curl and save results
$html = curl_exec($ch);

curl_close($ch);

// parse html and then save to a pdf file
$mpdf->WriteHTML($html);
$this->mpdf->Output($mydestination, \Mpdf\Output\Destination::FILE);

$ Mysrcfile içinde (önceki cevaplarda belirtildiği gibi) böyle json verilerini okuyacağım:

$data = json_decode(file_get_contents('php://input'));
// (then process it and build the page source)

1
Çok fazla işe yaramaz bilgi .. İlk kod ne işe yarar? İkinci pasaj ise cevap ..
Fipsi

@Fipsi, (ve tüm aşağılıklara) cevabım sadece ve açık bir şekilde diğerlerinin bir özeti. Ve yazdığım gibi, bir kullanım örneği (mpdf). Yazarken, nasıl yapılacağını anlamaya çalışırken böyle bir cevap görmeyi SEVDİM. Ve ikinci snippet'im kesinlikle cevap değil, çünkü json verilerini almak için, verilerin de düzgün bir şekilde gönderilmesi gerekiyor ve sadece göndermek için daha fazla yol değil, aynı zamanda tam olarak gerçek problem. Bu durumda, odak json_decode değildir, bunun yerine düzgün bir şekilde bir şey nasıl alınır file_get_contents('php://input').
Luca Reghellin

2
Ben aldatmadım ve niyetinizi anlıyorum .. Ama soru 'JSON Gönder' değil, 'JSON Al' sorusu. OP'nin alma sorunları olduğu ve göndermekle gerçekten ilgilenmediği
sorusundan
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.