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.