我一直在为此烦恼两天,我仍然不确定我做错了什么。我已经尝试使用Python 2.7使用urllib2,现在使用Python 3.6使用Requests。我甚至放弃了API并尝试使用sodapy更新元数据无济于事。
此代码段正在使用3.6的请求。我通过request.get()方法中的数据arg传递值,但是没有使用PATCH lambda更新值。
这是我的代码:
#!/usr/bin/python
#coding: utf-8
import base64
import json
import requests
username = '{REDACTED}'
password = '{REDACTED}'
string = '%s:%s' % (username, password)
base64string = base64.b64encode(string.encode())
app_token = '{REDACTED}'
values = """
{
"metadata" : {
"id" : "TEST",
"name" : "Business Entities_TEST"
}
}
"""
headers = {
'Accept': '*/*',
'X-Socrata-Host': 'data.colorado.gov',
'Content-Type': 'application/json',
'Authorization': 'Basic {REDACTED}',
'X-App-Token': app_token
}
request = requests.get('https://data.colorado.gov/api/views/metadata/v1/4ykn-tg5h', data=values, headers=headers)
request.get_method = lambda: 'PATCH'
response_body = request.json()
print(response_body)
我的打印响应是数据集的当前元数据,不包括我在values
变量中传递的更新。任何帮助将不胜感激!
编辑:这是我用urllib2运行python 2.7并获得相同结果的代码
#!/usr/bin/python
#coding: utf-8
import base64
import json
import requests
from urllib2 import Request, urlopen
username = '{REDACTED}'
password = '{REDACTED}'
auth = base64.encodestring('%s:%s' % (username, password)).replace('\n', '')
app_token = '{REDACTED}'
values = """{
"metadata" : {
"name" : "TESTING"
}
}"""
headers = {
'Accept': '*/*',
'X-Socrata-Host': 'data.colorado.gov',
'Content-Type': 'application/json',
'Authorization': 'Basic %s' % auth,
'X-App-Token': app_token
}
request = Request('https://data.colorado.gov/api/views/metadata/v1/4ykn-tg5h ', data=values, headers=headers)
request.get_method = lambda: 'PATCH'
response_body = urlopen(request).read()
print response_body
此处的相同问题是当前元数据将打印到控制台,但values
中的更新未反映出来。我已经仔细检查了所有参数,以确保我的用户名,pw,app-token等没有类型。没有运气。
答案 0 :(得分:2)
我是Socrata的开发人员Katie,也是构建此API的人之一。这里有几个可能的问题。
1)数据不应该在metadata
密钥下,就像顶层一样。也就是说,name
应该是您传递给API的JSON中的顶级键,例如{"name": "A new name!"}
2)您将无法更改id
字段。除非您使用严格的输入检查(请参阅文档的this部分),否则请求仍将通过,只是ID不会更新。
3)您可以使用内置的requests.patch
方法执行此操作,但是,您可能会错过所需的SSL设置请求,您可以使用pip install "requests[security]"
安装
这里有一些代码可以帮助您入门。如果您对此API有其他疑问,请与我们联系!如果你没有发现它(或者是偶然发现这个问题的其他人)的文档在这里:https://socratametadataapi.docs.apiary.io/
import json
import requests
# This is the full path to the metadata API on the domain that you care about
url = 'https://data.colorado.gov/api/views/metadata/v1'
# This is the unique identifier of the dataset you care about
uid = '4ykn-tg5h'
# And this is your login information
username = '{your socrata login}'
password = '{your socrata password}'
headers = {'Content-Type': 'application/json'}
# These are the fields you want to update
data = {'name': 'Testing 123!'}
response = requests.patch('{}/{}'.format(url, uid),
auth=(username, password),
headers=headers,
# the data has to be passed as a string
data=json.dumps(data))
print(response.json())