Преобразование строки ответа Curl в массиве JSON с PHP - PullRequest
0 голосов
/ 24 мая 2018

Я использую Curl для получения запроса от REST API.Вот мой код:

    #Curl init
    $ch = curl_init('https://192.168.0.1/api/invoke/LicenseRequest');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                                                'Content-Type: application/json',
                                                'Connection: Keep-Alive',
                                                'Accept: application/json'
                                                ));
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

#Username und PW
    curl_setopt($ch, CURLOPT_USERPWD, "****:****");
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);

#Post
    $post = [];
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    $response = curl_exec($ch);

    curl_close($ch);

Когда я echo $response это появляется (gettype возвращаемая строка):

HTTP/1.1 200 OK Cache-Control: no-cache,private,no-store,must-revalidate,max-stale=0,post-check=0,pre-check=0 Pragma: no-cache Content-Length: 733 Content-Type: application/json Expires: Wed, 23 May 2018 09:53:48 GMT Server: Microsoft-***** Date: Thu, 24 May 2018 09:53:48 GMT { "error": null, "token": null, "statusVersion": 2, "statusCode": "succeeded", "percentProgress": null, "statusText": null, "result": { "productKey": "************", "productVersion": "10.2.3.12921", "timestamp": "2018-05-24T09:53:48.2029026Z", "machineName": "******", "configuredInstances": 3, "configuredInstanceHosts": 2, "configuredClientAccessServers": 1, "instanceData": [ { "id": "l_container1", "usedLicenseCount": 912 }, { "id": "l_container2", "usedLicenseCount": 7 }, { "id": "l_container3", "usedLicenseCount": 2 } ] }, "logOutput": null }

Пока все хорошо, я думаю.Теперь я хочу разобрать «instanceData».Я думаю, что я должен использовать json_decode($response, true); для создания массива.Итак:

$result = json_decode($response, true);
echo $result;

Но когда я печатаю это для каждого эха, поле становится пустым.Я не получаю сообщение об ошибке, но сайт пуст.

Извините за мой английский, я надеюсь, что вы мне поможете.

1 Ответ

0 голосов
/ 24 мая 2018

Если вы установите CURLOPT_HEADER, а также CURLOPT_RETURNTRANSFER, то возвращенный ответ будет содержать заголовки и тело в одной строке.

Если вас интересует только тело, удалитестрока, устанавливающая параметр CURLOPT_HEADER, и ваш ответ будет содержать только JSON.Затем вы можете использовать json_decode (как вы уже пробовали) и выполнять любую необходимую вам обработку.

Если вы также заинтересованы в заголовках, вам нужно отделитьони из оставшейся части ответа:

$response = curl_exec($ch);
$info = curl_getinfo($ch);

$response = [
  'headers' => substr($response, 0, $info["header_size"]),
  'body' => substr($response, $info["header_size"]),
];

Теперь $response['headers'] будет содержать заголовки (в виде строки), а $response['body'] будет содержать JSON.

...