Отправка строки JSON через wp_remote_post ()

Я создаю интеграцию mailchimp и им нужен POST-вызов с кодом JSON.

Нет, я использую этот код, который на самом деле работает :

$data = wp_remote_post($url, array(
    'headers'   => array('Content-Type' => 'application/json; charset=utf-8'),
    'body'      => json_encode($array_with_parameters),
    'method'    => 'POST'
));

Но он возвращает предупреждение PHP

  

Предупреждение: http_build_query (): Параметр 1 должен быть массивом или объектом. Неверное значение, указанное в ./wp-includes/Requests/Transport/cURL.php в строке 507

Как его избежать?

Я попытался использовать простой массив в индексе body, но MailChimp возвращает ошибку анализа JSON.

7 голосов | спросил a-coder 26 PM00000020000005531 2016, 14:52:55

1 ответ


0

Попробуйте установить в своем запросе параметр data_format:

$data = wp_remote_post($url, array(
    'headers'     => array('Content-Type' => 'application/json; charset=utf-8'),
    'body'        => json_encode($array_with_parameters),
    'method'      => 'POST',
    'data_format' => 'body',
));

Похоже, что формат может по умолчанию не соответствовать query, и в этом случае WordPress пытается отформатировать данные с помощью http_build_query, что дает вам проблемы, поскольку вы уже форматируете тело как строку. Вот соответствующая проверка в wp-includes/class-http.php:

if (!empty($data)) {
    $data_format = $options['data_format'];

    if ($data_format === 'query') {
        $url = self::format_get($url, $data);
        $data = '';
    }
    elseif (!is_string($data)) {
        $data = http_build_query($data, null, '&');
    }
}

Поскольку ваша ошибка исходит из строки 507 из wp-includes/Requests/Transport/cURL.php, мы можем видеть, что это корневой вызов http_build_query:

protected static function format_get($url, $data) {
    if (!empty($data)) {
        $url_parts = parse_url($url);
        if (empty($url_parts['query'])) {
            $query = $url_parts['query'] = '';
        }
        else {
            $query = $url_parts['query'];
        }

        $query .= '&' . http_build_query($data, null, '&');
        $query = trim($query, '&');

        if (empty($url_parts['query'])) {
            $url .= '?' . $query;
        }
        else {
            $url = str_replace($url_parts['query'], $query, $url);
        }
    }
    return $url;
}
ответил phatskat 31 PM000000100000002931 2018, 22:12:29

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132