Php 无法更新数据集:can';t将资源作为字典列表发送

Php 无法更新数据集:can';t将资源作为字典列表发送,php,ckan,Php,Ckan,我们已经使用CKAN API(运行CKAN版本2.5.7)在PHP中构建了一组脚本,但是我们还没有成功地进行包更新调用。如果我们不发送带有POST数据的资源,那么它们都会被删除,这是我们不想要的。但我还没有找到一种方式发送他们,CKAN会接受 我们正在使用cURL: curl_setopt($ch, CURLOPT_POST,1); curl_setopt($ch,CURLOPT_POSTFIELDS,$dictionary); 在哪里 $dictionary['resources'] = j

我们已经使用CKAN API(运行CKAN版本2.5.7)在PHP中构建了一组脚本,但是我们还没有成功地进行包更新调用。如果我们不发送带有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调用时,我们得到一个错误:
只有DICT列表可以放在子模式('resources',)而不是


我认为这是一种抱怨,即POSTed参数是json_encode()返回的unicode字符串。那么,在不删除所有资源的情况下,我可以通过HTTP POST发送什么来让API满意呢?

通过将数组传递到
curl\u setopt($ch,CURLOPT\u POSTFIELDS,$dictionary)中
您正在以
多部分/表单数据的形式发送数据

因此,CKAN正在将数据本身展开,并以
资源的字符串作为结束,该字符串的内容是您的序列化数据:(
“[{},{},{},{}]”


我非常确信CKAN会将整个表单数据作为JSON对象接受,因此如果您移动
JSON_encode
来编码整个
$dictionary
(并且可能添加一个
内容类型
头?),那么CKAN应该完全分解它,从而为
资源
[{},{},{})提供一个Dict对象列表

是。就这样。我甚至不需要发送内容类型标题。上载文件(对于资源)时需要“多部分/表单数据”,但由于资源没有子模式,所以这不会成为问题。谢谢,你是个英雄。