Как построить CURL в структуре JSON-RPC в PHP?

В последнее время я работаю с API, который требует отправки данных в формате JSON-RPC.

И я так конструирую

function create_video($files) {
$api = "http://api.brightcove.com/services/post";

$local_file_list = $files['file']['tmp_name'];

foreach ($local_file_list as $local_file) {
try {
$ch = curl_init();

if (FALSE === $ch) {
throw new Exception('failed to initialize');
}

$params = array(
"encode_to" => "MP4",
"create_multiple_renditions" => "True",
"token" => WRITE_TOKEN,
"file" => @$local_file
);

$request = json_encode(array('jsonrpc' => '2.0', 'method' => 'create_video', 'params' => $params));

curl_setopt($ch, CURLOPT_URL, $api);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$content = curl_exec($ch);

if (FALSE === $content) {
throw new Exception(curl_error($ch), curl_errno($ch));
}

die(var_dump(json_decode($content)));

return json_decode($content);
} catch (Exception $e) {
trigger_error(sprintf('Curl failed with error #%d: %s', $e->getCode(), $e->getMessage()), E_USER_ERROR);
}
}
}

Проблема в том, что он создает неправильную структуру JSON по сравнению с правильной.

Запросить полезную нагрузку моей версии

------WebKitFormBoundary8VABz8KuNRE8Hepd
Content-Disposition: form-data; name="file[0]"; filename="big_buck_bunny.mp4"Content-Type: video/mp4


------WebKitFormBoundary8VABz8KuNRE8Hepd--

Запросить полезную нагрузку правильной версии

 ------WebKitFormBoundaryCAB6WEANBJxoB3Op
Content-Disposition: form-data; name="JSONRPC"
{"params":{"video":{"name":"test","shortDescription":"test","startDate":1432282741000,"endDate":null},"encode_to":"MP4","create_multiple_renditions":"True","token":"VyocgALDnxU8HPvmnSnckgmXjoPlYWomc2La5Tn-evuAfsnSPJJoow.."},"method":"create_video"}
------WebKitFormBoundaryCAB6WEANBJxoB3Op
Content-Disposition: form-data; name="filePath"; filename="big_buck_bunny.mp4"Content-Type: video/mp4


------WebKitFormBoundaryCAB6WEANBJxoB3Op

Content-Disposition: form-data; name="JSONView"
{"params":{"video":{"name":"test","shortDescription":"test","startDate":1432282741000,"endDate":null},"encode_to":"MP4","create_multiple_renditions":"True","token":"VyocgALDnxU8HPvmnSnckgmXjoPlYWomc2La5Tn-evuAfsnSPJJoow.."},"method":"create_video"}
------WebKitFormBoundaryCAB6WEANBJxoB3Op--

И правильный сайт, который отправляет данные, вы можете ввести форму для проверки

http://docs.brightcove.com/en/video-cloud/media/samples/create_video.html#request

И ссылка на API (создать видео)

https://docs.brightcove.com/en/video-cloud/media/references/reference.html#Video_Write

Большое спасибо за помощь.

2

Решение

Документация их API-ссылки (вторая ссылка) гласит:

Для запросов на запись данные, передаваемые в API записи на носитель, должны быть
в формате JSON, закодированный как параметр формы с именем «json». JSON
документ должен содержать поле «метод» и поле «params», а также
примеры, которые вы публикуете, должны показывать все тело запроса POST:
= JSON

Итак, просто замените:

curl_setopt($ch, CURLOPT_POSTFIELDS, $request);

с:

curl_setopt($ch, CURLOPT_POSTFIELDS, 'json=' . $request);

и это должно работать тогда. Я получил ошибку «неверный токен» вместо «Не удалось найти JSON-RPC». заменив код выше.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]