Размещение вложенного массива в PHP с использованием cURL - PullRequest
0 голосов
/ 08 января 2020

У меня есть некоторые данные, которые мне нужно отправить в конечную точку, которая является вложенным массивом, например:

$contentPostData = array(
            'contents' => array(
                'name' => $comment_text,
                'fingerprint' => $fingerprint,
                'signers' => array(
                    $ownerAuthId
                )
            )
        );

Когда я пытаюсь:

json_encode($contentPostData);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

Я получаю ошибку:

string(518) "{"timestamp":1578447151168,"message":"Can't read request","details":["JSON parse error: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException

Как мне отформатировать contentPostData, чтобы его можно было правильно десериализовать?

1 Ответ

0 голосов
/ 08 января 2020

Вы упоминаете:

json_encode($contentPostData);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

Но назначаете ли вы закодированный json на $data? Я имею в виду: вы делаете:

$data = json_encode($contentPostData);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

Я вижу, что веб-сервис, которому вы звоните, использует com.fasterxml.jackson, поэтому, скорее всего, ожидает формат JSON, и поэтому ваша сериализация должна быть в порядке (если имена полей и типы совпадают).

Я также предлагаю установить заголовок для информирования того веб-сервиса о том, что вы отправляете файл json (если он допускает другие форматы):

curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: application/json'                                                                     
);

Итак:

$data = json_encode($contentPostData);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: application/json'                                                                       
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

Если это не сработает, то, скорее всего: a) ваш JSON недействителен (ожидается другая структура) или b) веб-служба фактически ожидает формат, отличный от JSON (возможно, стандартные многоэлементные данные например)

...