Я никогда не использовал cURL раньше, и я думаю, что я столкнулся с препятствиями в моем обучении. Я пытаюсь сделать HTTP-запрос GET на мой сервер Wowza, который использует Rest API для возврата результатов JSON. URL фактически возвращает его в XML, но поддержка Wowza говорит, что я могу получить ответ в JSON, добавив тип контента, как я сделал.
$url = 'http://DOMAINNAME:8087/v2/servers/_defaultServer_/vhosts/_defaultVHost_/applications/live/instances/_definst_/incomingstreams/ncopeland';
$cURL = curl_init();
curl_setopt($cURL, CURLOPT_URL, $url);
curl_setopt($cURL, CURLOPT_HTTPGET, true);
curl_setopt($cURL, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json;charset=utf-8',
'Accept: application/json'
));
$result = curl_exec($cURL);
$result = json_decode($result,true);
curl_close($cURL);
Ответ должен быть таким.
{
"serverName": "_defaultServer_",
"sourceIp": "ncopeland",
"isPTZEnabled": false,
"applicationInstance": "_definst_",
"name": "ncopeland",
"isRecordingSet": false,
"isStreamManagerStream": true,
"isPublishedToVOD": false,
"isConnected": true,
"ptzPollingInterval": 2000
}
Но вместо этого ответ возвращается и форматируется следующим образом.
{"serverName":"_defaultServer_","sourceIp":"ncopeland","isPTZEnabled":false,"applicationInstance":"_definst_","name":"ncopeland","isRecordingSet":false,"isStreamManagerStream":true,"isPublishedToVOD":false,"isConnected":false,"ptzPollingInterval":2000}
Как я могу отформатировать это, чтобы я мог получить их в пригодные для использования переменные. На самом деле все, что мне нужно из ответа, это «имя» и «isConnected», поэтому я могу обновить поля в БД. На самом деле все, что мне нужно из ответа, это «имя» и «isConnected», поэтому я могу обновлять поля в БД следующим образом.
Array (
[serverName] => _defaultServer_
[sourceIp] => ncopeland
[isPTZEnabled] => false
[applicationInstance] => _definst_
[name] => ncopeland
[isRecordingSet] => false
[isStreamManagerStream] => true
[isPublishedToVOD] => false
[isConnected] => false
[ptzPollingInterval] => false
)
Так что я могу работать с переменной $ obj как с массивом.
echo $obj['name'];
echo $obj['isConnected'];
Я не уверен, что вам не хватает, все должно работать так, как задумано в вашем коде. Тот факт, что json возвращает данные без перевода строки, не меняет того, как они будут использоваться позже.
$jsondata = '{"serverName":"_defaultServer_","sourceIp":"ncopeland","isPTZEnabled":false,"applicationInstance":"_definst_","name":"ncopeland","isRecordingSet":false,"isStreamManagerStream":true,"isPublishedToVOD":false,"isConnected":false,"ptzPollingInterval":2000}';
$result = json_decode($jsondata,true); //is array
var_dump ($result['serverName']);
var_dump ($result['isConnected']);
Кроме того, имейте в виду, что вы не можете отображать логические значения.
Кстати, использование объектов даже проще, чем массивы, на мой взгляд.
$jsondata = '{"serverName":"_defaultServer_","sourceIp":"ncopeland","isPTZEnabled":false,"applicationInstance":"_definst_","name":"ncopeland","isRecordingSet":false,"isStreamManagerStream":true,"isPublishedToVOD":false,"isConnected":false,"ptzPollingInterval":2000}';
$result = json_decode($jsondata);var_dump ($result->serverName);
var_dump ($result->isConnected);
В конце концов, с моим кодом все было в порядке. Приходите, чтобы выяснить, на моем серверном решении пакет, который я использовал от Bluehost, заблокировал порты, которые мне были нужны, чтобы сделать http-запрос через cURL. Мне удалось перейти на выделенный IP-адрес, чтобы открыть порты, в которых я нуждался, чтобы они работали и с тех пор работают отлично.