POST JSON данные через CURL и захват их - PullRequest
4 голосов
/ 30 января 2012

Я пытаюсь передать данные json в качестве параметра для cURL POST. Однако, я застрял в том, чтобы схватить его и сохранить в БД.

файл cURL:

$data = array("name" => "Hagrid", "age" => "36");                                                                    
$data_string = json_encode($data);                                                                                   

$url = 'http://localhost/project/test_curl';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
                                    'Content-Type: application/json')                                                                                           
                                    );                       
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                                                                     

$result = curl_exec($ch);  

//based on http://www.lornajane.net/posts/2011/posting-json-data-with-php-curl

файл test_curl:

    $order_info = $_POST; // this seems to not returning anything

    //SAVE TO DB... saving empty...

Что я пропустил? Weew ....

Ответы [ 2 ]

20 голосов
/ 30 января 2012

Вы отправляете данные в виде необработанного JSON в теле, они не будут заполнять переменную $_POST.

Вам необходимо выполнить одно из двух действий:

  1. Выможно изменить тип содержимого на тип, который будет заполнять массив $_POST
  2. . Вы можете читать необработанные данные тела.

Я бы порекомендовал второй вариант, если вы контролируете оба концасвязи, так как это позволит свести размер тела запроса к минимуму и сохранить пропускную способность с течением времени.( Edit: я не особо подчеркивал, что объем сохраняемой полосы пропускания пренебрежимо мал, всего несколько байт на запрос, это может быть только серьезной проблемой при очень высокой скорости трафика. Однако я все же рекомендую второй вариантпотому что это самый чистый способ )

В вашем файле test_curl сделайте следующее:

$fp = fopen('php://input', 'r');
$rawData = stream_get_contents($fp);

$postedJson = json_decode($rawData);

var_dump($postedJson);

Если вы хотите заполнить переменную $_POST, вам необходимоизмените способ отправки данных на сервер:

$data = array (
  'name' => 'Hagrid',
  'age' => '36'
);

$bodyData = array (
  'json' => json_encode($data)
);
$bodyStr = http_build_query($bodyData);

$url = 'http://localhost/project/test_curl';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  'Content-Type: application/x-www-form-urlencoded',
  'Content-Length: '.strlen($bodyStr)
));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $bodyStr);

$result = curl_exec($ch);

Необработанный, не закодированный JSON теперь будет доступен в $_POST['json'].

0 голосов
/ 26 апреля 2016

Используйте следующую функцию php для публикации данных с использованием функции php curl в формате x-www-form-urlencoded.

<?php
    $bodyData = http_build_query($data); //for x-www-form-urlencoded
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...