Làm thế nào để POST dữ liệu JSON với cURL PHP?


132

Đây là mã của tôi,

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

Và ở trang khác, tôi đang lấy dữ liệu bài viết.

    print_r ($_POST);

Đầu ra là

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

Vì vậy, tôi không nhận được dữ liệu phù hợp ngay cả tại máy chủ của mình, đó là mảng trống. Tôi muốn triển khai REST bằng json tại http://docs.shopify.com/api/customer#create


2
Bạn không thiếu chuyển đổi $datasang $data_stringsử dụng json_encode()??? Không thấy dòng mã này ...
shadyyx

Xin lỗi tôi đã không viết ở đây nhưng trong mã của tôi, tôi đã viết code$ data_opes = json_encode ($ data); codevà làm thế nào để viết mã trong các bình luận? trong các bình luận tôi không thể viết ngắt dòng và làm thế nào để viết mã?
dùng1463076

Câu trả lời:


192

Bạn đang gửi json không chính xác - nhưng ngay cả khi nó là chính xác, bạn sẽ không thể kiểm tra bằng cách sử dụng print_r($_POST)( đọc tại sao ở đây ). Thay vào đó, trên trang thứ hai của bạn, bạn có thể lấy yêu cầu đến bằng cách sử dụng file_get_contents("php://input"), nó sẽ chứa json POSTed . Để xem dữ liệu nhận được ở định dạng dễ đọc hơn, hãy thử điều này:

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

Trong mã của bạn, bạn đang chỉ ra Content-Type:application/json, nhưng bạn không mã hóa tất cả dữ liệu POST - chỉ giá trị của trường POST "khách hàng". Thay vào đó, hãy làm một cái gì đó như thế này:

$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: Bạn có thể hưởng lợi từ việc sử dụng thư viện của bên thứ ba thay vì tự mình giao tiếp với API Shopify.


1
Hừ! Tôi đã đấu tranh về lý do tại sao tôi không nhận được dữ liệu qua $ _POST. Vấn đề là tôi đã phải sử dụng php: // input như bạn đã nói. Cảm ơn.
YOMorales 04/11/2015

Vì vậy, bạn không cần phải xác định rõ ràng đó là yêu cầu POST? Được biết vì CURLOPT_POSTFIELDS được đặt?
Srneczek

Câu trả lời này ở đâu khi tôi tìm kiếm nó cả tuần trước? Bây giờ tôi tìm thấy nó sau khi tôi phải tự tìm ra!
pythonia29033

Sidenote: Nếu bạn gửi JSON và mong đợi JSON là phản hồi, thì một số API cũng yêu cầu thiết lập loại phản hồi curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json', 'Accept:application/json'));(nếu không bạn có thể gửi JSON, nhưng lấy XML làm câu trả lời).
pixelbrackets

2
bạn đã lưu trong ngày
Nalu Edu

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

Mã này làm việc cho tôi. Bạn co thể thử...


13

Thay thế

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

với:

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

Tôi không hiểu ý của bạn về "trang khác", tôi hy vọng đó là trang tại: 'url_to_post'. Nếu trang đó được viết bằng PHP, JSON bạn vừa đăng ở trên sẽ được đọc theo cách bên dưới:

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

Tại sao bạn sẽ cho rằng? Nếu anh ta đưa dữ liệu vào trường 'khách hàng', anh ta phải làm vậy vì một lý do, phải không?
Okonomiyaki3000

Vâng, cảm ơn, tôi đã bỏ lỡ phần đó. Nhưng anh ấy, IMO, đang làm sai. Tôi sẽ cập nhật câu trả lời của tôi với nó.
UltraInstinc

Không có giải pháp nào ở trên hoạt động để lấy dữ liệu json trong tệp php :(
Gohel Kiran

7

Vui lòng thử mã này: -

$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

Hãy thử ví dụ này.

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

Mã page2.php của bạn

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

?>

1

Hãy thử như thế này:

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

Điều quan trọng bạn đã quên là json_encode dữ liệu của bạn. Nhưng bạn cũng có thể thấy thuận tiện khi sử dụng curl_setopt_array để đặt tất cả các tùy chọn curl cùng một lúc bằng cách chuyển một mảng.


-1. Kiểm tra API tại đây: api.shopify.com/customer.html#create . Phần thân mà máy chủ mong đợi trong JSON, không phải urlencoding-json. Kiểm tra câu trả lời của tôi, không cần sử dụng array(..)trong `CURLOPT_POSTFIELDS
UltraInstinc

Vâng, như tôi đã nói anh ấy đang gửi nhầm. Việc array(..)chuyển đến CURLOPT_POSTFIELDS` cũng sẽ mã hóa JSON.
UltraInstinc

Dù sao, tôi đã thử nhiều lần với các mã khác nhau nhưng tôi không thể làm trong json bây giờ tôi đã làm thành công trong xml.
dùng1463076
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.