কীভাবে পিএইচপি সিআরএল দিয়ে 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.