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.


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;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.