PHP cURL के साथ 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()??? कोड की यह लाइन न देखें ...
shadyyx

क्षमा करें, मैंने यहां नहीं लिखा, लेकिन मेरे कोड में मैंने code$ data_string = json_encode ($ data) लिखा है ; codeऔर टिप्पणियों में कोड कैसे लिखें? टिप्पणियों में मैं लाइन ब्रेक नहीं लिख सकता और इसलिए कोड कैसे लिखूं?
user1463076

जवाबों:


193

आप गलत तरीके से जौइन कर रहे हैं - लेकिन अगर यह सही था, तो भी आप परीक्षण का उपयोग नहीं कर पाएंगे print_r($_POST)( यहां पढ़ें क्यों )। इसके बजाय, अपने दूसरे पृष्ठ पर, आप आने वाले अनुरोध का उपयोग कर सकते हैं file_get_contents("php://input"), जिसमें POSTed json होगा । प्राप्त डेटा को अधिक पठनीय प्रारूप में देखने के लिए, यह प्रयास करें:

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

आपके कोड में, आप संकेत कर रहे हैं Content-Type:application/json, लेकिन आप सभी POST डेटा के json- एन्कोडिंग नहीं हैं - केवल "ग्राहक" POST फ़ील्ड का मूल्य। इसके बजाय, ऐसा कुछ करें:

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

सिडेनोट: आपको सीधे स्वयं Shopify API के साथ इंटरफेस करने के बजाय तीसरे पक्ष के पुस्तकालय का उपयोग करने से लाभ हो सकता है ।


1
हा! मैं संघर्ष कर रहा था कि मैं $ _POST के माध्यम से डेटा प्राप्त क्यों नहीं कर रहा था। मुद्दा यह था कि मुझे php का उपयोग करना था: // इनपुट जैसा आपने कहा। धन्यवाद।
योमोरेल्स 22

तो आप स्पष्ट रूप से यह पोस्ट अनुरोध है निर्दिष्ट नहीं है? इसका ज्ञात कारण CURLOPT_POSTFIELDS सेट है?
श्रीनेकजेक

यह जवाब कहां था जब मैं पिछले सप्ताह पूरे सप्ताह इसे देख रहा था? अब मुझे यह पता चला कि मुझे खुद को पता लगाना था!
pythonian29033

सिडेनोट: यदि आप JSON भेजते हैं और JSON से प्रतिक्रिया के रूप में अपेक्षा करते हैं, तो कुछ API को प्रतिक्रिया प्रकार सेट करने की आवश्यकता होती है curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json', 'Accept:application/json'));(अन्यथा आप JSON भेज सकते हैं, लेकिन XML को उत्तर के रूप में प्राप्त कर सकते हैं)।
पिक्सलब्रेक्ट्स

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'। यदि वह पृष्ठ PHP में लिखा गया है, तो आपके द्वारा ऊपर पोस्ट किया गया JSON नीचे दिए गए तरीके से पढ़ा जाएगा:

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

आप ऐसा क्यों मानेंगे? यदि वह 'ग्राहक' क्षेत्र में डेटा डाल रहा है, तो उसे ऐसा किसी कारण से करना चाहिए, नहीं?
Okonomiyaki3000

हाँ, धन्यवाद, मैं उस हिस्से को याद किया। लेकिन वह, आईएमओ, यह गलत कर रहा है। मैं इसके साथ अपने उत्तर को अपडेट करूंगा।
अल्ट्रास्टिंक्ट

उपरोक्त समाधानों में से कोई भी php फ़ाइल में json डेटा प्राप्त करने के लिए काम नहीं करता है :(
गोहल किरण

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;
?>

आपका पृष्ठ2.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);

आपके द्वारा भूली गई महत्वपूर्ण चीज़ आपके डेटा को json_encode करना था। लेकिन आप एक सरणी पास करके एक बार में सभी कर्ल विकल्प सेट करने के लिए curl_setopt_array का उपयोग करना सुविधाजनक पा सकते हैं।


-1। यहां एपीआई की जांच करें: api.shopify.com/customer.html#create । वह सर्वर जो JSON में अपेक्षित है, urlencoded-json नहीं। मेरे उत्तर की जाँच करें array(..), `CURLOPT_POSTFIELDS में उपयोग करने की कोई आवश्यकता नहीं है
UltraInstinct

हां, जैसा कि मैंने कहा कि वह इसे गलत भेज रहा है। array(..)CURLOPT_POSTFIELDS` को पास करने से JSON को भी लिंक कर दिया जाएगा।
अल्ट्रास्टिंक्ट

वैसे भी, मैंने कई बार अलग-अलग कोड के साथ कोशिश की लेकिन मैं json में सक्षम नहीं था अब मैंने xml में सफलतापूर्वक किया।
user1463076
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.