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())