API метаданных Сократа не обновляет набор данных

Я уже два дня спорю с этим и до сих пор не уверен, что делаю неправильно. Я попытался использовать оба urllib2 с использованием Python 2.7 и теперь запросы с использованием Python 3.6. Я даже отказался от API и попытался использовать sodapy для обновления метаданных, но безрезультатно.

Этот фрагмент использует запросы на 3.6. Я передаю значения через arg данных в методе request.get(), но значения не обновляются с помощью лямбды PATCH.

Вот мой код:

#!/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 не отражаются Я дважды проверил все свои параметры, чтобы убедиться, что в моем имени пользователя, pw, app-token и т. П. Нет типа. Не повезло.

1 ответ

Решение

Я Кэти, разработчик в Socrata, и один из людей, которые создали этот API. Здесь есть несколько возможных проблем.

1) Данные не должны быть под metadata ключ, как есть, на высшем уровне. То есть name должен быть ключом верхнего уровня в JSON, который вы передаете API, например {"name": "A new name!"}

2) Вы не сможете изменить 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())
Другие вопросы по тегам