HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist

Обмен json-ом между PHP-скриптами на разных серверах

Приветствую!

Задача: На одном сервере есть папка с .txt файлами, в них чистый JSON. Читаю данные из этих файлов скриптом client.php находящимся рядом с папкой, теперь надо отправить считанные данные на другой сервер. На удаленном сервере лежит скрипт server.php, который эти данные должен принять, отдать ответ скрипту client.php, обработать и сохранить в .txt файл в JSON-формате.

Считываю файлы из client.php без проблем. Из server.php сделать запись в файл - тоже ок. Проблема посередине. Никак не могу отправить данные, судя по всему, они туда, к server.php даже не доходят. Что я делаю не так?

client.php:
<?php
$api_key = 'B12347162936387BB33534B85C873'; // Для простой проверки
$api_url = 'http://remote.dev/server.php'; // Куда отправлять
$file = '20140525/data.txt'; // Локальный файл с json-данными
$json_data = file_get_contents( $file ); // Читаем из файла
// Пробуем отправить, для начала только $api_key
$curl = curl_init($api_url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($api_key));
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
                                            'Content-Type:application/json',
                                            'Content-Length:'.strlen($api_key)
                                        ));
$json_response = curl_exec($curl);
$curl_errorno = curl_errno($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
echo $json_response; // Выводим ответ
curl_close($curl);
?>

server.php:
<?php
$api_key = 'B12347162936387BB33534B85C873'; // Для сверки
print_r ($_POST); // Смотрим прилетели ли данные?
print_r ($_REQUEST); // Может сюда прилетели?
?>

Получаемый ответ - 2 пустых массива:
Array ( ) Array ( )

Что не так? Бьюсь головой о стену уже час. Гугл не помог, документация по curl_setopt() тоже. Пробовал отправлять различные вариации - $api_key, $data, собирал их в один массив, переводил в json и так далее. В ответ - то же самое, пустые массивы.
  • Вопрос задан
  • 20392 просмотра
Решения вопроса 2
rOOse
@rOOse
Frontend developer
Надо передавать массив или же принимать сырые данные - $HTTP_RAW_POST_DATA или php://input
Ответ написан
antoo
@antoo
Переменная $_POST используются только при Content-Type application/x-www-form-urlencoded или multipart/form-data. В твоем случае ты отправляешь просто сырые данные, поэтому PHP не может их распарсить и запихнуть в соответствующую переменную. Получить их можно следующим способом:
$json = file_get_contents('php://input'); 
echo $json;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@cmx
Думаю, проблема в том, что ты явно не указываешь в каком поле передавать данные. Попробуй следующую конструкцию:
curl_setopt($curl, CURLOPT_POSTFIELDS, array(
    'apikey' => $api_key,
    'data' => $json_data,
));


Также можешь попробовать указать сразу целиком файл для передачи.
Для передачи файла, укажите перед именем файла @, а также используйте полный путь к файлу. Тип файла также может быть указан с помощью формата ';type=mimetype', следующим за именем файла.

Original: www.php.net/manual/ru/function.curl-setopt.php
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы