Trimiterea unui șir JSON prin wp_remote_post()

26 aug. 2016, 14:52:55
Vizualizări: 42.3K
Voturi: 27

Construiesc o integrare cu MailChimp și aceștia necesită un apel POST cu cod JSON.

Acum, folosesc acest cod care de fapt funcționează:

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

Dar, returnează o avertizare PHP

Warning: http_build_query(): Parameter 1 expected to be Array or Object. Incorrect value given in ../wp-includes/Requests/Transport/cURL.php on line 507

Cum pot să evit această avertizare?

Am încercat să folosesc direct array-ul simplu în indexul 'body' dar MailChimp returnează o eroare de parsare JSON.

2
Comentarii

Ai aplicat acest patch în nucleu? https://core.trac.wordpress.org/ticket/37700

Otto Otto
26 aug. 2016 15:45:31

Interesant. Dacă este un plugin comercial, atunci ar trebui să funcționeze pe orice instalare WP. Dar din moment ce pare a fi o eroare în WP, pentru mine e ok. Mulțumesc mult!

a-coder a-coder
26 aug. 2016 17:05:07
Toate răspunsurile la întrebare 1
2
36

Încearcă să setezi parametrul data_format în cererea ta astfel:

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

Se pare că formatul poate fi implicit setat la query, caz în care WordPress încearcă să formateze datele folosind http_build_query, ceea ce îți creează probleme deoarece tu deja formatezi corpul ca un șir de caractere. Iată verificarea relevantă din 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, '&');
    }
}

Deoarece eroarea ta vine de la linia 507 din wp-includes/Requests/Transport/cURL.php, putem vedea că aceasta este apelul de bază la 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;
}
31 aug. 2018 22:12:29
Comentarii

Salvator de viață! Răspuns perfect.

Suraj Lulla Suraj Lulla
11 apr. 2022 07:13:32

Acum se află în fișierele wp-includes/Requests/src/Requests.php și wp-includes/Requests/src/Transport/*.php, dar logica este aceeași. Se pare că valoarea body este doar o convenție, codul verifică doar pentru orice altceva decât query, dar folosirea acestei valori funcționează și este cea mai viabilă pe termen lung.

Walf Walf
10 mai 2023 07:29:03