CURL фактически не отправляет данные POST

обзор
У меня есть сценарий, мы назовем его one.php, что создает базу данных и таблицы. Он также содержит массив данных для публикации в другом скрипте, two.php, который отсортирует данные и вставит их в нашу вновь созданную базу данных.

Ваша помощь очень, очень ценится.

Эта проблема
two.php есть чек на $_POST[] массив в самом верху скрипта:

if (empty($_POST))
{
$response = array('status' => 'fail', 'message' => 'empty post array');
echo json_encode($response);
exit;
}

Обычно это не сработает, если массив post empty(), Однако при отправке данных из one.php в two.php с помощью cURLЯ получаю вышеуказанный кодированный массив в качестве ответа, и мои данные не прогрессируют дальше two.php,

Я выложу соответствующий код из файлов ниже для вашего удобства просмотра:

one.php

$one_array = array('name' => 'John', 'fav_color' => 'red');
$one_url   = 'http://' . $_SERVER['HTTP_HOST'] . '/path/to/two.php';

$response = post_to_url($one_url, $one_array, 'application/json');
echo $response; die;

Это в настоящее время дает мне следующее:

{"status":"fail","message":"empty post array"}

post_to_url() функция, для справки

function post_to_url($url, $array, $content_type)
{
$fields = '';
foreach($array as $key => $value)
{
$fields .= $key . '=' . $value . '&';
}

$fields = rtrim($fields, '&');

$ch = curl_init();
$httpheader = array(
'Content-Type: ' . $content_type,
'Accept: ' . $content_type
);

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader);

$result = curl_exec($ch);

curl_close($ch);

return $result;
}

two.php

header("Content-type: application/json");
$response = array(); //this is used to build the responses, like below

if (empty($_POST))
{
$response['status']  = 'fail';
$response['message'] = 'empty post array';
echo json_encode($response);
exit;
}
elseif (!empty($_POST))
{
//do super neat stuff
}

9

Решение

Поскольку вы устанавливаете тип содержимого тела запроса как «application / json», PHP не будет заполняться $_POST в «two.php». Поскольку вы отправляете данные в кодировке URL, лучше всего отправить только Accept: заголовок:

curl_setopt($ch, CURLOPT_HTTPHEADER, ['Accept: ' . $content_type]);

Тем не менее, «two.php» на самом деле не использует заголовок Accept: и всегда выводит JSON; в этом случае вы можете обойтись без установки CURLOPT_HTTPHEADER совсем.

Обновить

Создание закодированных данных url из массива также может быть проще (и безопаснее):

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array));
6

Другие решения

У меня есть такая проблема, но в моем случае я добавил

Content-Type: {APPLICATION/TYPE}
Content-Length: {DATA LENGTH}

и проблема была решена.

0

По вопросам рекламы [email protected]