Socrata Metadata API不更新数据集

时间:2018-01-09 15:11:17

标签: python socrata soda

我一直在为此烦恼两天,我仍然不确定我做错了什么。我已经尝试使用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等没有类型。没有运气。

1 个答案:

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