Gửi chuỗi JSON thông qua wp_remote_post ()


12

Tôi đang xây dựng một tích hợp mailchimp và họ yêu cầu một cuộc gọi POST với mã JSON.

Không, tôi đang sử dụng mã này thực sự hoạt động :

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

Nhưng, nó trả về một cảnh báo PHP

Cảnh báo: http_build_query (): Tham số 1 dự kiến ​​là Mảng hoặc Đối tượng. Giá trị không chính xác được đưa ra trong ../wp-includes/Requests/Transport/cURL.php trên dòng 507

Làm thế nào để tránh nó?

Tôi đã cố gắng chỉ sử dụng mảng đơn giản trong chỉ mục 'body' nhưng MailChimp trả về lỗi phân tích cú pháp JSON.


1
Bạn đã áp dụng bản vá này vào cốt lõi? core.trac.wordpress.org/ticket/37700
Otto

Hấp dẫn. Là một plugin thương mại, sau đó phải hoạt động trên mọi cài đặt WP. Nhưng vì dường như là một lỗi WP, đối với tôi là ok. Cảm ơn nhiều!
một lập trình viên

Câu trả lời:


13

Hãy thử đặt data_formattham số trong yêu cầu của bạn như vậy:

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

Có vẻ như định dạng có thể được mặc định query, trong trường hợp đó WordPress cố gắng định dạng dữ liệu bằng cách sử dụng http_build_query, điều này gây ra cho bạn các vấn đề vì bạn đã định dạng phần thân dưới dạng chuỗi. Đây là kiểm tra có liên quan 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, '&');
    }
}

Vì lỗi của bạn đến từ dòng 507 của wp-includes/Requests/Transport/cURL.php, chúng tôi có thể thấy rằng đây là cuộc gọi gốc đến 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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.