Мы создали набор сценариев в PHP с использованием API CKAN (работает ckan версии 2.5.7), но нам не удалось успешно выполнить вызов package_update. Если мы не отправим ресурсы с данными POST, то все они будут удалены, что нам не нужно. Но я не нашел способ отправить их, которые примет CKAN.
Мы используем cURL:
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$dictionary);
где
$dictionary['resources'] = json_encode(
array_map(
function($resource) {
return filter_out_unwanted_fields($resource); // returns an associative array
},
$all_resources_for_the_dataset
)
);
Когда мы запускаем вызов API, мы получаем ошибку: Only lists of dicts can be placed against subschema ('resources',), not <type 'unicode'>
Я интерпретирую это как жалобу на то, что параметр POSTed является строкой Unicode, возвращаемой json_encode (). Итак, что я могу отправить через HTTP POST, чтобы сделать API счастливым, не удаляя все мои ресурсы?
Передав массив в curl_setopt($ch,CURLOPT_POSTFIELDS,$dictionary);
вы отправляете данные как multipart/form-data
(ссылка).
Таким образом, CKAN распаковывает данные как таковые и заканчивает строкой для resource
— содержимое этой строки является вашими сериализованными данными: ("[{}, {}, {}]"
)
Я вполне уверен, что CKAN примет все данные формы в виде объекта JSON, поэтому если вы переместите json_encode
закодировать весь $dictionary
(и, возможно, добавить Content-Type
заголовок?) тогда CKAN должен полностью это распутать, и, таким образом, дать вам список объектов Dict для resource
([{}, {}, {}]
)
Других решений пока нет …