Bagaimana POST Data JSON Dengan PHP cURL?

132

Ini kode saya,

$url = 'url_to_post';
$data = array(
    "first_name" => "First name",
    "last_name" => "last name",
    "email"=>"[email protected]",
    "addresses" => array (
        "address1" => "some address",
        "city" => "city",
        "country" => "CA",
        "first_name" =>  "Mother",
        "last_name" =>  "Lastnameson",
        "phone" => "555-1212",
        "province" => "ON",
        "zip" => "123 ABC"
    )
);
$data_string = json_encode($data);
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, array("customer"=>$data_string));
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,
    array(
        'Content-Type:application/json',
        'Content-Length: ' . strlen($data_string)
    )
);

$result = curl_exec($ch);
curl_close($ch);

Dan di halaman lain, saya mengambil data posting.

    print_r ($_POST);

Output adalah

HTTP/1.1 200 OK
Date: Mon, 18 Jun 2012 07:58:11 GMT
Server: Apache
X-Powered-By: PHP/5.3.6
Vary: Accept-Encoding
Connection: close
Content-Type: text/html

Array ( ) 

Jadi, saya tidak mendapatkan data yang tepat bahkan di server saya sendiri, ini adalah array kosong. Saya ingin menerapkan REST menggunakan json di http://docs.shopify.com/api/customer#create

pengguna1463076
sumber
2
Tidakkah Anda kehilangan konversi $datauntuk $data_stringmenggunakan json_encode()??? Jangan melihat baris kode ini ...
shadyyx
Maaf saya tidak menulis di sini tetapi dalam kode saya saya menulis code$ data_string = json_encode ($ data); codedan bagaimana menulis kode dalam komentar? dalam komentar saya tidak dapat menulis jeda baris dan jadi bagaimana menulis kode?
user1463076

Jawaban:

193

Anda POSTINGAN json salah - tetapi bahkan jika itu benar, Anda tidak akan dapat menguji menggunakan print_r($_POST)( baca mengapa di sini ). Sebaliknya, pada halaman kedua Anda, Anda dapat menangkap permintaan masuk menggunakan file_get_contents("php://input"), yang akan berisi json POSTed . Untuk melihat data yang diterima dalam format yang lebih mudah dibaca, coba ini:

echo '<pre>'.print_r(json_decode(file_get_contents("php://input")),1).'</pre>';

Dalam kode Anda, Anda menunjukkan Content-Type:application/json, tetapi Anda tidak mengkode semua data POST json - hanya nilai dari bidang POST "pelanggan". Sebagai gantinya, lakukan sesuatu seperti ini:

$ch = curl_init( $url );
# Setup request to send json via POST.
$payload = json_encode( array( "customer"=> $data ) );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $payload );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
# Return response instead of printing.
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
# Send request.
$result = curl_exec($ch);
curl_close($ch);
# Print response.
echo "<pre>$result</pre>";

Sidenote: Anda mungkin mendapat manfaat dari menggunakan perpustakaan pihak ketiga daripada berinteraksi langsung dengan API Shopify secara langsung.

Stephen M. Harris
sumber
1
Hah! Saya berjuang mengapa saya tidak menerima data melalui $ _POST. Masalahnya adalah saya harus menggunakan php: // input seperti yang Anda katakan. Terima kasih.
YOMorales
jadi Anda tidak perlu secara eksplisit menentukan itu adalah permintaan POST? Ini dikenal karena CURLOPT_POSTFIELDS diatur?
Srneczek
di mana jawaban ini ketika saya mencarinya sepanjang minggu minggu lalu? Sekarang saya menemukannya setelah saya harus mencari tahu sendiri!
pythonian29033
Sidenote: Jika Anda mengirim JSON dan mengharapkan JSON sebagai respons, maka beberapa API memerlukan pengaturan jenis respons juga curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json', 'Accept:application/json'));(jika tidak, Anda dapat mengirim JSON, tetapi dapatkan XML sebagai jawaban).
pixelbrackets
2
Anda menyelamatkan hari itu
Nisal Edu
29
$url = 'url_to_post';
$data = array("first_name" => "First name","last_name" => "last name","email"=>"[email protected]","addresses" => array ("address1" => "some address" ,"city" => "city","country" => "CA", "first_name" =>  "Mother","last_name" =>  "Lastnameson","phone" => "555-1212", "province" => "ON", "zip" => "123 ABC" ) );

$postdata = json_encode($data);

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
$result = curl_exec($ch);
curl_close($ch);
print_r ($result);

Kode ini bekerja untuk saya. Anda dapat mencoba...

roki bintang
sumber
13

Menggantikan

curl_setopt($ch, CURLOPT_POSTFIELDS, array("customer"=>$data_string));

dengan:

$data_string = json_encode(array("customer"=>$data));
//Send blindly the json-encoded string.
//The server, IMO, expects the body of the HTTP request to be in JSON
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);

Saya tidak mengerti apa yang Anda maksud dengan "halaman lain", saya harap ini adalah halaman di: 'url_to_post'. Jika halaman itu ditulis dalam PHP, JSON yang baru saja Anda posting di atas akan dibaca dengan cara di bawah ini:

$jsonStr = file_get_contents("php://input"); //read the HTTP body.
$json = json_decode($jsonStr);
UltraInstinct
sumber
Mengapa Anda menganggap itu? Jika dia meletakkan data di bidang 'pelanggan', dia pasti melakukannya karena suatu alasan, bukan?
Okonomiyaki3000
Ya, terima kasih, saya melewatkan bagian itu. Tapi dia, IMO, melakukan kesalahan. Saya akan memperbarui jawaban saya dengannya.
UltraInstinct
Tidak ada solusi di atas yang berfungsi untuk mendapatkan data json dalam file php :(
Gohel Kiran
7

Silakan coba kode ini: -

$url = 'url_to_post';

$data = array("first_name" => "First name","last_name" => "last name","email"=>"[email protected]","addresses" => array ("address1" => "some address" ,"city" => "city","country" => "CA", "first_name" =>  "Mother","last_name" =>  "Lastnameson","phone" => "555-1212", "province" => "ON", "zip" => "123 ABC" ) );

$data_string = json_encode(array("customer" =>$data));

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);

curl_close($ch);

echo "$result";
Damini Mahawer
sumber
3

Coba contoh ini.

<?php 
 $url = 'http://localhost/test/page2.php';
    $data = array("first_name" => "First name","last_name" => "last name","email"=>"[email protected]","addresses" => array ("address1" => "some address" ,"city" => "city","country" => "CA", "first_name" =>  "Mother","last_name" =>  "Lastnameson","phone" => "555-1212", "province" => "ON", "zip" => "123 ABC" ) );
    $ch=curl_init($url);
    $data_string = urlencode(json_encode($data));
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_POSTFIELDS, array("customer"=>$data_string));


    $result = curl_exec($ch);
    curl_close($ch);

    echo $result;
?>

Kode page2.php Anda

<?php
$datastring = $_POST['customer'];
$data = json_decode( urldecode( $datastring));

?>
Prasad Rajapaksha
sumber
1

Coba seperti ini:

$url = 'url_to_post';
// this is only part of the data you need to sen
$customer_data = array("first_name" => "First name","last_name" => "last name","email"=>"[email protected]","addresses" => array ("address1" => "some address" ,"city" => "city","country" => "CA", "first_name" =>  "Mother","last_name" =>  "Lastnameson","phone" => "555-1212", "province" => "ON", "zip" => "123 ABC" ) );
// As per your API, the customer data should be structured this way
$data = array("customer" => $customer_data);
// And then encoded as a json string
$data_string = json_encode($data);
$ch=curl_init($url);

curl_setopt_array($ch, array(
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $data_string,
    CURLOPT_HEADER => true,
    CURLOPT_HTTPHEADER => array('Content-Type:application/json', 'Content-Length: ' . strlen($data_string)))
));

$result = curl_exec($ch);
curl_close($ch);

Kuncinya adalah Anda lupa json_encode data Anda. Tetapi Anda juga mungkin merasa nyaman menggunakan curl_setopt_array untuk mengatur semua opsi curl sekaligus dengan melewatkan array.

Okonomiyaki3000
sumber
-1. Periksa API di sini: api.shopify.com/customer.html#create . Tubuh yang server harapkan dalam JSON, bukan urlencoded-json. Periksa jawaban saya, tidak perlu digunakan array(..)dalam `CURLOPT_POSTFIELDS
UltraInstinct
Ya, seperti yang saya katakan dia salah kirim. Melewati sebuah array(..)ke CURLOPT_POSTFIELDS` akan urlencode JSON juga.
UltraInstinct
Lagi pula, saya mencoba berkali-kali dengan kode yang berbeda tetapi saya tidak dapat melakukannya di json sekarang saya berhasil di xml.
user1463076