Невозможно обновить набор данных: невозможно отправить ресурсы в виде списка словарей

Мы создали набор сценариев в 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 счастливым, не удаляя все мои ресурсы?

1

Решение

Передав массив в curl_setopt($ch,CURLOPT_POSTFIELDS,$dictionary); вы отправляете данные как multipart/form-data (ссылка).

Таким образом, CKAN распаковывает данные как таковые и заканчивает строкой для resource — содержимое этой строки является вашими сериализованными данными: ("[{}, {}, {}]")

Я вполне уверен, что CKAN примет все данные формы в виде объекта JSON, поэтому если вы переместите json_encode закодировать весь $dictionary (и, возможно, добавить Content-Type заголовок?) тогда CKAN должен полностью это распутать, и, таким образом, дать вам список объектов Dict для resource ([{}, {}, {}])

2

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

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