Enviando string JSON através de wp_remote_post ()

13

Estou construindo uma integração de mailchimp e eles exigem uma chamada POST com código JSON.

Não, estou 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'
));

Mas, ele retorna um aviso do PHP

Aviso: http_build_query (): O parâmetro 1 deve ser Matriz ou Objeto. Valor incorreto fornecido em ../wp-includes/Requests/Transport/cURL.php na linha 507

Como evitá-lo?

Eu tentei usar apenas a matriz simples no índice 'body', mas o MailChimp retorna um erro de análise JSON.

codificador a
fonte
1
Você aplicou esse patch ao núcleo? Core.trac.wordpress.org/ticket/37700
Otto
Interessante. É um plug-in comercial e, em seguida, deve funcionar em qualquer instalação do WP. Mas desde que parece ser um bug do WP, para mim está ok. Muito Obrigado!
-coder

Respostas:

16

Tente definir o data_formatparâmetro em sua solicitação da seguinte maneira:

$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 o formato pode estar no padrão query, nesse caso o WordPress tenta formatar os dados usando http_build_query, o que está causando problemas, já que você já está formatando o corpo como uma string. Aqui está o 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 seu erro vem da linha 507 de wp-includes/Requests/Transport/cURL.php, podemos ver que esta é a chamada raiz para 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
fonte