Надсилання рядка JSON через wp_remote_post ()


13

Я будую інтеграцію 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.


1
Ви застосували цей патч до основної? core.trac.wordpress.org/ticket/37700
Отто

Цікаво. Це комерційний плагін, то він повинен працювати на будь-якій установці WP. Але оскільки, здається, помилка WP, для мене це нормально. Дуже дякую!
кодер

Відповіді:


16

Спробуйте встановити 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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.