How to POST JSON Data With PHP cURL?

前端 未结 7 2190
失恋的感觉
失恋的感觉 2020-11-22 10:02

Here is my code,

$url = \'url_to_post\';
$data = array(
    \"first_name\" => \"First name\",
    \"last_name\" => \"last name\",
    \"email\"=>\"e         


        
相关标签:
7条回答
  • 2020-11-22 10:20

    Replace

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

    with:

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

    I dont get what you meant by "other page", I hope it is the page at: 'url_to_post'. If that page is written in PHP, the JSON you just posted above will be read in the below way:

    $jsonStr = file_get_contents("php://input"); //read the HTTP body.
    $json = json_decode($jsonStr);
    
    0 讨论(0)
  • 2020-11-22 10:22

    You are POSTing the json incorrectly -- but even if it were correct, you would not be able to test using print_r($_POST) (read why here). Instead, on your second page, you can nab the incoming request using file_get_contents("php://input"), which will contain the POSTed json. To view the received data in a more readable format, try this:

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

    In your code, you are indicating Content-Type:application/json, but you are not json-encoding all of the POST data -- only the value of the "customer" POST field. Instead, do something like this:

    $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: You might benefit from using a third-party library instead of interfacing with the Shopify API directly yourself.

    0 讨论(0)
  • 2020-11-22 10:23
    $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);
    

    This code worked for me. You can try...

    0 讨论(0)
  • 2020-11-22 10:25

    First,

    1. always define certificates with CURLOPT_CAPATH option,

    2. decide how your POSTed data will be transfered.

    1 Certificates

    By default:

    • CURLOPT_SSL_VERIFYHOST == 2 which "checks the existence of a common name and also verify that it matches the hostname provided" and

    • CURLOPT_VERIFYPEER == true which "verifies the peer's certificate".

    So, all you have to do is:

    const CAINFO = SERVER_ROOT . '/registry/cacert.pem';
    ...
    \curl_setopt($ch, CURLOPT_CAINFO, self::CAINFO);
    

    taken from a working class where SERVER_ROOT is a constant defined during application bootstraping like in a custom classloader, another class etc.

    Forget things like \curl_setopt($handler, CURLOPT_SSL_VERIFYHOST, 0); or \curl_setopt($handler, CURLOPT_SSL_VERIFYPEER, 0);.

    Find cacert.pem there as seen in this question.

    2 POST modes

    There are actually 2 modes when posting data:

    • the data is transfered with Content-Type header set to multipart/form-data or,

    • the data is a urlencoded string with application/x-www-form-urlencoded encoding.

    In the first case you pass an array while in the second you pass a urlencoded string.

    multipart/form-data ex.:

    $fields = array('a' => 'sth', 'b' => 'else');
    $ch = \curl_init();
    \curl_setopt($ch, CURLOPT_POST, 1);
    \curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
    

    application/x-www-form-urlencoded ex.:

    $fields = array('a' => 'sth', 'b' => 'else');
    $ch = \curl_init();
    \curl_setopt($ch, CURLOPT_POST, 1);
    \curl_setopt($ch, CURLOPT_POSTFIELDS, \http_build_query($fields));
    

    http_build_query:

    Test it at your command line as

    user@group:$ php -a
    php > $fields = array('a' => 'sth', 'b' => 'else');
    php > echo \http_build_query($fields);
    a=sth&b=else
    

    The other end of the POST request will define the appropriate mode of connection.

    0 讨论(0)
  • 2020-11-22 10:38

    Please try this code:-

    $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";
    
    0 讨论(0)
  • 2020-11-22 10:39

    Try this example.

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

    Your page2.php code

    <?php
    $datastring = $_POST['customer'];
    $data = json_decode( urldecode( $datastring));
    
    ?>
    
    0 讨论(0)
提交回复
热议问题