Socrata元数据API无法更新数据集问题求助
解决Socrata数据集元数据无法更新的问题
我看你折腾了两天都没搞定这个问题,确实挺闹心的。先帮你排查下代码里的几个关键问题,应该就能解决了:
1. 错误的请求方法实现方式
你在Python3代码里用requests.get()然后强行修改get_method为PATCH,这种做法绕开了Requests库对PATCH请求的原生支持,很容易导致请求处理异常。应该直接用requests.patch()方法来发送请求。
2. 数据传递方式问题
用data参数传递JSON字符串时,虽然你手动设置了Content-Type,但用json参数直接传入字典会更稳妥——Requests会自动帮你序列化并设置正确的请求头,避免格式错误。
3. (Python2代码专属)URL末尾的空格
你urllib2代码里的URL末尾多了个空格:'https://data.colorado.gov/api/views/metadata/v1/4ykn-tg5h ',这个会导致请求路径不正确,服务器可能无法正确识别端点。
修正后的Python3 Requests代码
#!/usr/bin/python #coding: utf-8 import base64 import json import requests username = '{REDACTED}' password = '{REDACTED}' app_token = '{REDACTED}' # 用字典格式定义要更新的元数据,更清晰 metadata_update = { "metadata": { "name": "Business Entities_TEST" } } # 构建认证头 auth_str = f"{username}:{password}" base64_auth = base64.b64encode(auth_str.encode()).decode('utf-8') headers = { 'Accept': '*/*', 'X-Socrata-Host': 'data.colorado.gov', 'Authorization': f'Basic {base64_auth}', 'X-App-Token': app_token } # 直接用patch方法,用json参数传递数据 response = requests.patch( 'https://data.colorado.gov/api/views/metadata/v1/4ykn-tg5h', json=metadata_update, headers=headers ) # 检查响应状态码,方便排查问题 print(f"响应状态码: {response.status_code}") response_body = response.json() print(response_body)
修正后的Python2 urllib2代码
#!/usr/bin/python #coding: utf-8 import base64 import json from urllib2 import Request, urlopen username = '{REDACTED}' password = '{REDACTED}' app_token = '{REDACTED}' values = json.dumps({ "metadata": { "name": "TESTING" } }) auth = base64.encodestring('%s:%s' % (username, password)).replace('\n', '') headers = { 'Accept': '*/*', 'X-Socrata-Host': 'data.colorado.gov', 'Content-Type': 'application/json', 'Authorization': 'Basic %s' % auth, 'X-App-Token': app_token } # 去掉URL末尾的空格 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
额外检查点
如果修正后还是不行,建议再确认:
- 你的账号是否是该数据集的所有者或拥有编辑权限,Socrata的API会严格校验权限
- 确认元数据字段名是否正确,比如
name是数据集的显示名称,是否符合Socrata的字段规范 - 查看响应的状态码,如果是4xx(比如403、400),可以根据错误信息进一步排查
内容的提问来源于stack exchange,提问作者Kade Beem
相关产品推荐
相关产品推荐

