Как запросить JSON ответ от C3.ai COVID-19 API? - PullRequest
2 голосов
/ 13 апреля 2020

Я запрашиваю API C3.ai для анализа унифицированных данных COVID-19. Я вижу, что по умолчанию все API возвращают отформатированную строку xml. В настоящее время я конвертирую формат в json, используя библиотеку python, xmltodict. Есть ли способ, которым я могу напрямую запросить ответ JSON?

Вот код, который я запускаю:

import json, requests, xmltodict
url = "https://api.c3.ai/covid/api/1/outbreaklocation/fetch/"
request_data = {
    "spec": {
        "include": "id",
        "limit": 1
    }
}
response = requests.post(url=url, json=request_data)
print(response.text)

И соответствующий ответ, который я получаю, выглядит следующим образом:

<fetchResponse version="2.0">
  <type>
    <module>metadata</module>
    <name>FetchResult</name>
    <bindings>
      <k>T</k>
      <v>
        <type>
          <module>typesys</module>
          <name>ReferenceType</name>
        </type>
        <name>OutbreakLocation</name>
        <mixing>true</mixing>
      </v>
    </bindings>
  </type>
  <objs>
    <k>0</k>
    <v>
      <id>AaenHunze_Drenthe_Netherlands</id>
      <meta>
        <fetchInclude>[id,version,typeIdent]</fetchInclude>
        <fetchType>OutbreakLocation</fetchType>
      </meta>
      <version>262145</version>
      <typeIdent>EP_LOC</typeIdent>
    </v>
  </objs>
  <count>1</count>
  <hasMore>true</hasMore>
</fetchResponse>

И я использую следующий фрагмент кода для преобразования xml в json:

fetch_object = xmltodict.parse(response.text)

Ответы [ 3 ]

2 голосов
/ 13 апреля 2020

вы можете попробовать указать заголовок типа контента в вашем запросе.

import json, requests, xmltodict
url = "https://api.c3.ai/covid/api/1/outbreaklocation/fetch/"
headers={'content-type': 'application/json'}
request_data = {
    "spec": {
        "include": "id",
        "limit": 1
    }
}
response = requests.post(url=url, json=request_data, headers=headers)
print(response.text)
1 голос
/ 17 апреля 2020

Попробуйте попробовать репо с открытым исходным кодом c3covid19 . Вы можете найти документы здесь . Это неофициальная оболочка соединения c3 covid19 озера данных для python.

Установка

pip install c3covid19

Запуск

from c3covid19 import c3api

cnx=c3api()

request_data = {
    "spec": {
        "include": "id",
        "limit": 1
    }
}

output=cnx.request(
    data_type='outbreaklocation',
    parameters=request_data,
    api='fetch',
    output_type='objs'
)
0 голосов
/ 19 апреля 2020

Сервер возвращает XML по умолчанию. Чтобы получить ответ JSON, необходимо установить HTTP-заголовок запроса Accept на application/json. Если вы отправите запрос, в котором заголовок Content-Type установлен на application/json, но без указания значения для Accept , вы все равно получите ответ XML от API ,

Вот пример запроса cURL для оцененного показателя c о количестве подтвержденных смертей в Италии в марте 2020 года согласно данным из университета Джона Хопкинса. Его можно протестировать из любого интерфейса оболочки или импортировать в приложение Postman, например:

curl 'https://api.c3.ai/covid/api/1/outbreaklocation/evalmetrics' \
    --request POST \
    --header 'Content-Type: application/json' \
    --header 'Accept: application/json' \
    --data-binary '{
      "spec": {
          "ids": ["Italy"],
          "expressions":["JHU_ConfirmedDeaths"],
          "interval":"DAY",
          "start":"2020-03-01",
          "end":"2020-03-31"
        }
    }'

Возвращает объект JSON. Здесь ниже тот же вызов, что и предыдущий, но без включения заголовка Accept . В этом случае возвращается XML ответ:

curl 'https://api.c3.ai/covid/api/1/outbreaklocation/evalmetrics' \
    --request POST \
    --header 'Content-Type: application/json' \
    --data-binary '{
      "spec": {
          "ids": ["Italy"],
          "expressions":["JHU_ConfirmedDeaths"],
          "interval":"DAY",
          "start":"2020-03-01",
          "end":"2020-03-31"
        }
    }'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...