无法更新数据集:无法将资源作为字典列表发送

时间:2018-02-20 16:33:04

标签: php ckan

我们使用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满意而不删除我的所有资源?

1 个答案:

答案 0 :(得分:2)

将数组传递到curl_setopt($ch,CURLOPT_POSTFIELDS,$dictionary);,您将数据发送为multipart/form-datareference)。

因此,CKAN正在展开数据,最后是resource的字符串 - 该字符串的内容是您的序列化数据:("[{}, {}, {}]"

我非常有信心CKAN会将整个表单数据作为JSON对象接受,因此如果您移动json_encode来编码整个$dictionary(并且可能添加Content-Type } header然后CKAN应该完全解开,然后为resource[{}, {}, {}]

提供一个Dict对象列表