Envío de cadena JSON a través de wp_remote_post ()

13

Estoy construyendo una integración de mailchimp y requieren una llamada POST con código JSON.

No, estoy usando este código que realmente funciona :

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

Pero, devuelve una advertencia de PHP

Advertencia: http_build_query (): se espera que el parámetro 1 sea Array u Object. Valor incorrecto dado en ../wp-includes/Requests/Transport/cURL.php en la línea 507

¿Cómo evitarlo?

Intenté usar la matriz simple en el índice 'body' pero MailChimp devuelve un error de análisis JSON.

codificador
fuente
1
¿Has aplicado este parche al núcleo? core.trac.wordpress.org/ticket/37700
Otto
Interesante. Es un complemento comercial, entonces debe funcionar en cualquier instalación de WP. Pero como parece ser un error de WP, para mí está bien. ¡Muchas gracias!
un codificador

Respuestas:

16

Intente configurar el data_formatparámetro en su solicitud de la siguiente manera:

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

Parece que el formato puede estar predeterminado query, en cuyo caso WordPress intenta formatear los datos usando http_build_query, lo que le está dando problemas ya que ya está formateando el cuerpo como una cadena. Aquí está el check-in relevante 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, '&');
    }
}

Como su error proviene de la línea 507 de wp-includes/Requests/Transport/cURL.php, podemos ver que esta es la llamada raíz a 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
fuente