- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
CKAN 提供 ckanapi
访问包 the CKAN API通过 Python 或命令行。
我可以使用它来下载元数据、创建资源等。但我无法在单个 API 调用中创建包并将资源上传到它。 (包也称为数据集。)
在内部,ckanapi
scans all keys moving any file-like parameters into a separate dict
,它passes to the requests.session.post(files=..)
parameter .
这是我能得到的最接近的,但 CKAN 返回 HTTP 500 错误(从 this guide to requests
复制):
with ckanapi.RemoteCKAN('http://myckan.example.com', apikey='real-key', user_agent=ua, username='joe', password='pwd') as ckan:
ckan.action.package_create(name='joe_data',
resources=('report.xls',
open('/path/to/file.xlsx', 'rb'),
'application/vnd.ms-excel',
{'Expires': '0'}))
我也试过resources=open('path/file')
, files=open('file')
,更短或更长的元组,但是得到同样的 500 错误。
requests
文档说:
:param files: (optional) Dictionary of ``'filename': file-like-objects``
for multipart encoding upload.
我无法传递 ckanapi
resources={'filename': open('file')}
因为 ckanapi
没有检测到文件,尝试将其作为普通参数传递给 requests
,但失败了(“BufferedReader 不是 JSON 可序列化的”,因为它试图使文件成为 POST
参数)。如果我尝试传递文件列表,我也会得到同样的结果。但是the API is able to创建一个包并在一次调用中添加大量资源。
那么如何通过单个 ckanapi
调用创建一个包和多个资源?
最佳答案
我对此感到好奇,并认为我应该将一些东西放在一起进行测试。不幸的是我没有玩过你提到的 CLI。但我希望这能帮助您和其他遇到这个问题的人。
我不是很肯定,但我猜你的资源字典格式不正确。资源需要是字典列表。
这是一个用于执行单个 api 调用插入的 ruby 脚本(目前我的首选语言):
# Ruby script to create a package and resource in one api call.
# You can run this in https://repl.it/languages/ruby
# Don't forget to update URLs and API key.
require 'csv'
require 'json'
require 'net/http'
hash_to_json = {
"title" => 'test1',
"name" => 'test1',
"owner_org" => 'bbb9682e-b58c-4826-bf4b-b161581056be',
"resources" => [
{
"url" => 'http://www.resource_domain.com/doc.kml'
}
]
}.to_json
uri = URI('http://ckan_app_domain.com:5000/api/3/action/package_create')
Net::HTTP.start(uri.host, uri.port) do |http|
request = Net::HTTP::Post.new uri
request['Authorization'] = 'user-api-key'
request.body = hash_to_json
response = http.request request
puts response.body
end
这是一个简单的 python 脚本来做同样的事情(感谢 CKAN 文档为我修改了这个模板)
#!/usr/bin/env python
import urllib2
import urllib
import json
import pprint
# Put the details of the dataset we're going to create into a dict.
dataset_dict = {
'name': 'my_dataset_name',
'notes': 'A long description of my dataset',
'owner_org': 'bbb9682e-b58c-4826-bf4b-b161581056be',
'resources': [
{
'url': 'example.com'
}
]
}
# Use the json module to dump the dictionary to a string for posting.
data_string = urllib.quote(json.dumps(dataset_dict))
# We'll use the package_create function to create a new dataset.
request = urllib2.Request(
'http://ckan_app_domain.com:5000/api/3/action/package_create')
# Creating a dataset requires an authorization header.
# Replace *** with your API key, from your user account on the CKAN site
# that you're creating the dataset on.
request.add_header('Authorization', 'user-api-key')
# Make the HTTP request.
response = urllib2.urlopen(request, data_string)
assert response.code == 200
# Use the json module to load CKAN's response into a dictionary.
response_dict = json.loads(response.read())
assert response_dict['success'] is True
# package_create returns the created package as its result.
created_package = response_dict['result']
pprint.pprint(created_package)
关于python - 使用 ckanapi 和 Python 使用资源创建 CKAN 包/数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48054042/
CKAN 提供 ckanapi访问包 the CKAN API通过 Python 或命令行。 我可以使用它来下载元数据、创建资源等。但我无法在单个 API 调用中创建包并将资源上传到它。 (包也称为数
我是一名优秀的程序员,十分优秀!