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.

un codeur
la source
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;
}
phatskat
la source