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

Pregunta:

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 'cuerpo' pero MailChimp devuelve un error de análisis JSON.

Respuesta:

Intente configurar el parámetro data_format en su solicitud de esta 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 para 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á la verificación relevante en 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, '&');
    }
}

Dado que 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;
}

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım