我们使用CKAN API(运行ckan版本2.5.7)在PHP中构建了一组脚本,但是我们还没有成功地进行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参数是json_encode()返回的unicode字符串。那么,我可以通过HTTP POST发送什么来使API满意而不删除我的所有资源?
答案 0 :(得分:2)
将数组传递到curl_setopt($ch,CURLOPT_POSTFIELDS,$dictionary);
,您将数据发送为multipart/form-data
(reference)。
因此,CKAN正在展开数据,最后是resource
的字符串 - 该字符串的内容是您的序列化数据:("[{}, {}, {}]"
)
我非常有信心CKAN会将整个表单数据作为JSON对象接受,因此如果您移动json_encode
来编码整个$dictionary
(并且可能添加Content-Type
} header然后CKAN应该完全解开,然后为resource
([{}, {}, {}]
)