Php 无法更新数据集:can';t将资源作为字典列表发送
我们已经使用CKAN API(运行CKAN版本2.5.7)在PHP中构建了一组脚本,但是我们还没有成功地进行包更新调用。如果我们不发送带有POST数据的资源,那么它们都会被删除,这是我们不想要的。但我还没有找到一种方式发送他们,CKAN会接受 我们正在使用cURL: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
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对象列表
)是。就这样。我甚至不需要发送内容类型标题。上载文件(对于资源)时需要“多部分/表单数据”,但由于资源没有子模式,所以这不会成为问题。谢谢,你是个英雄。