Socrata 元数据 API 未更新数据集
Socrata Metadata API Not Updating Dataset
我已经为此烦恼了两天了,但仍然不确定自己做错了什么。我已经尝试使用 Python 2.7 的 urllib2 和现在使用 Python 3.6 的请求。我什至放弃了 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
变量中传递的更新。任何帮助将不胜感激!
编辑:这是我的 运行 python 2.7 代码,其中 urllib2 具有相同的结果
#!/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
中的更新没有反映出来。我已经仔细检查了我的所有参数,以确保我的用户名、密码、应用程序令牌等中没有类型。不走运。
我是 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())
我已经为此烦恼了两天了,但仍然不确定自己做错了什么。我已经尝试使用 Python 2.7 的 urllib2 和现在使用 Python 3.6 的请求。我什至放弃了 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
变量中传递的更新。任何帮助将不胜感激!
编辑:这是我的 运行 python 2.7 代码,其中 urllib2 具有相同的结果
#!/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
中的更新没有反映出来。我已经仔细检查了我的所有参数,以确保我的用户名、密码、应用程序令牌等中没有类型。不走运。
我是 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())