কীভাবে পিএইচপি সিআরএল দিয়ে JSON ডেটা পোস্ট করবেন?


132

এখানে আমার কোড,

$url = 'url_to_post';
$data = array(
    "first_name" => "First name",
    "last_name" => "last name",
    "email"=>"email@gmail.com",
    "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);

এবং অন্য পৃষ্ঠায়, আমি পোস্ট ডেটা পুনরুদ্ধার করছি।

    print_r ($_POST);

আউটপুট হয়

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 ( ) 

সুতরাং, আমি নিজের সার্ভারেও সঠিক ডেটা পাচ্ছি না, এটি খালি অ্যারে। আমি http://docs.shopify.com/api/customer#create হিসাবে json ব্যবহার করে REST প্রয়োগ করতে চাই


2
আপনি রূপান্তর অনুপস্থিত না তো $dataকরতে $data_stringব্যবহার json_encode()???
কোডটির

দুঃখিত আমি এখানে লিখিনি তবে আমার কোডে আমি লিখেছি code$ ডেটা_স্ট্রিং = জসন_এনকোড ($ ডেটা); codeএবং মন্তব্যে কোড কীভাবে লিখব? মন্তব্যে আমি লাইন ব্রেকটি লিখতে পারি না এবং কীভাবে কোড লিখব?
ব্যবহারকারী 1463076

উত্তর:


193

আপনি জাসনকে ভুলভাবে পোস্ট করছেন - তবে এটি সঠিক থাকলেও আপনি ব্যবহার করে পরীক্ষা করতে সক্ষম হবেন না print_r($_POST)( কেন এখানে পড়ুন )। পরিবর্তে, আপনার দ্বিতীয় পৃষ্ঠায়, আপনি আগত অনুরোধটি ব্যবহার file_get_contents("php://input")করে নাব করতে পারেন , এতে পোস্টেড জেসন থাকবে । আরও পঠনযোগ্য ফর্ম্যাটে প্রাপ্ত ডেটা দেখার জন্য এটি ব্যবহার করে দেখুন:

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

আপনার Content-Type:application/jsonকোডটিতে , আপনি নির্দেশ দিচ্ছেন , তবে আপনি সমস্ত পোস্টের ডেটা জসন-এনকোডিং করছেন না - কেবলমাত্র "গ্রাহক" পোস্ট ফিল্ডের মান। পরিবর্তে, এর মতো কিছু করুন:

$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>";

সিডিনোট: আপনি নিজেই শপাইফাই এপিআইয়ের সাথে হস্তক্ষেপের পরিবর্তে তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করে উপকৃত হতে পারেন ।


1
Hah! আমি strugg _POST এর মাধ্যমে কেন ডেটা গ্রহণ করছিলাম না তা নিয়ে লড়াই করছিলাম। সমস্যাটি হ'ল আমাকে আপনার পিপিএপি: // ইনপুট ব্যবহার করতে হয়েছিল said ধন্যবাদ।
YOMorales

সুতরাং আপনি স্পষ্টভাবে নির্দিষ্ট করতে হবে না এটি পোষ্ট অনুরোধ? এটি পরিচিত কারণ CURLOPT_POSTFIELDS সেট করা আছে?
শ্রেনেসেক

গত সপ্তাহে আমি যখন পুরো সপ্তাহটি এটির সন্ধান করছিলাম তখন এই উত্তরটি কোথায় ছিল? আমি নিজেকে খুঁজে বের করার পরে এটি উপায় খুঁজে!
পাইথোনিয়ান 29033

সিডিনোট: আপনি যদি জেএসওএন প্রেরণ করেন এবং জেএসএনকে প্রতিক্রিয়া হিসাবে প্রত্যাশা করেন, তবে কিছু এপিআই-তে অবশ্যই প্রতিক্রিয়া প্রকারটি সেট করা দরকার curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json', 'Accept:application/json'));(অন্যথায় আপনি জেএসওএন পাঠাতে পারেন, তবে উত্তর হিসাবে এক্সএমএল পাবেন)।
পিক্সেলব্রেকেট

2
আপনি দিনটি রক্ষা করেছেন
নিসাল এদু

29
$url = 'url_to_post';
$data = array("first_name" => "First name","last_name" => "last name","email"=>"email@gmail.com","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);

এই কোডটি আমার পক্ষে কাজ করেছিল। আপনি চেষ্টা করতে পারেন...


13

প্রতিস্থাপন করা

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

সঙ্গে:

$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);

"অন্যান্য পৃষ্ঠা" দ্বারা আপনি যা বোঝাতে চেয়েছিলেন তা আমি পেতে পারি না, আমি আশা করি এটি পৃষ্ঠা: 'url_to_post' এ is যদি সেই পৃষ্ঠাটি পিএইচপিতে লেখা থাকে, আপনি সদ্য উপরে পোস্ট করেছেন JSON নীচের উপায়ে পড়তে হবে:

$jsonStr = file_get_contents("php://input"); //read the HTTP body.
$json = json_decode($jsonStr);

তুমি কেন ধরে নিবে? যদি সে 'গ্রাহক' ক্ষেত্রে ডেটা রাখে, তবে তাকে অবশ্যই কোনও কারণে করা উচিত, না?
Okonomiyaki3000

হ্যাঁ, ধন্যবাদ, আমি সেই অংশটি মিস করেছি। তবে তিনি, আইএমও, এটি ভুল করছেন। আমি আমার উত্তরটি এটি দিয়ে আপডেট করব।
UltraInstinct

উপরের সমাধানগুলির কোনওটিই পিএইচপি ফাইলে জেসন ডেটা পাওয়ার জন্য কাজ করে না :(
গোহেল কিরণ

7

দয়া করে এই কোডটি চেষ্টা করুন: -

$url = 'url_to_post';

$data = array("first_name" => "First name","last_name" => "last name","email"=>"email@gmail.com","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";

3

এই উদাহরণ চেষ্টা করুন।

<?php 
 $url = 'http://localhost/test/page2.php';
    $data = array("first_name" => "First name","last_name" => "last name","email"=>"email@gmail.com","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;
?>

আপনার page2.php কোড

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

?>

1

এটির মতো চেষ্টা করুন:

$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@gmail.com","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);

আপনি যে মূল জিনিসটি ভুলে গেছেন তা হ'ল আপনার ডেটা জেসন_কেনড করা। তবে আপনি একবারে অ্যারে পাস করে সমস্ত কার্ল বিকল্পগুলি সেট করতে curl_setopt_array ব্যবহার করাও সুবিধাজনক বলে মনে করতে পারেন।


-1। এপিআই এখানে দেখুন: api.shopify.com/customer.html#create । সার্ভারটি JSON- এ প্রত্যাশা করে এমন শরীর, urlncoded-json নয়। আমার উত্তরটি যাচাই করুন, array(..)URL CURLOPT_POSTFIELDS
আল্ট্রা ইন্সটিনিট

হ্যাঁ, আমি যেমন বলেছি যে সে এটি ভুল পাঠাচ্ছে। array(..)CURLOPT_POSTFIELDS` এ একটি পাস করা জেএসওএনকেও ইউলিনকোড করবে।
UltraInstinct

যাইহোক, আমি বিভিন্ন কোড দিয়ে বহুবার চেষ্টা করেছি তবে আমি এখন জেসসনে সক্ষম হচ্ছিলাম না আমি সফলভাবে এক্সএমএল করেছিলাম।
ব্যবহারকারী 1463076
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.