Envoi de chaîne JSON via wp_remote_post ()


13

Je construis une intégration mailchimp et ils nécessitent un appel POST avec du code JSON.

Non, j'utilise ce code qui fonctionne réellement :

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

Mais, il renvoie un avertissement PHP

Avertissement: http_build_query (): le paramètre 1 devrait être un tableau ou un objet. Valeur incorrecte donnée dans ../wp-includes/Requests/Transport/cURL.php sur la ligne 507

Comment l'exploiter?

J'ai essayé d'utiliser simplement le tableau simple dans l'index 'body' mais MailChimp renvoie une erreur d'analyse JSON.


1
Avez-vous appliqué ce patch au core? core.trac.wordpress.org/ticket/37700
— Otto

Intéressant. Est un plugin commercial, doit donc fonctionner sur n'importe quelle installation WP. Mais comme il semble que ce soit un bug WP, pour moi c'est ok. Merci beaucoup!
— a-coder

Réponses:


16

Essayez de définir le data_formatparamètre dans votre demande comme suit:

$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',
));

Il semble que le format soit par défaut query, auquel cas WordPress tente de formater les données à l'aide http_build_query, ce qui vous pose des problèmes puisque vous formatez déjà le corps sous forme de chaîne. Voici l'enregistrement pertinent 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, '&');
    }
}

Puisque votre erreur provient de la ligne 507 de wp-includes/Requests/Transport/cURL.php, nous pouvons voir que c'est l'appel racine à 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;
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.