Skip to main content

metadriven-адаптер для RESTAPI запросов

Project description

REST2JSON

Конфигурируемый адаптер, способный выполнять чтение данных с использованием внешнего REST-сервиса без написания клиента под каждый конкретный API на основании описания метаданных этого сервиса.

Особенности

  • Гибкая конфигурация через OmegaConf
  • Загрузка OpenAPI спецификаций из файлов (YAML/JSON) или по URL
  • Пакетная обработка запросов с подготовкой payload(Возможно,придется отказаться в пользу явного построения запроса)
  • Поддержка контекстного менеджера для безопасного управления ресурсами
  • Генерация JSON Schema из OpenAPI спецификации

Установка

pip install git+https://github.com/Siinthd/Rest2JSON.git
pip install REST2JSON --index-url {mirror}

Быстрый старт

Простой запрос

from rest2json import REST2JSON

config_file = 'C:/Users/kdenis/Documents/Work/configs/config_WorldBank.yaml'

import yaml 

with open(config_file) as stream:
    try:
         config = yaml.safe_load(stream)
    except yaml.YAMLError as exc:
        print(exc)

#Иницализация адаптера, в этот момент происходит чтение/конфигурации,скачивание спецификации и ее парсинг
adapter = REST2JSON(config)
# get_schema() возвращает схему данных в <class 'dict'> - формате
#   по умолчанию (raw = False) вернет Spark dataframe ddl
#   (raw = True) возвращает структуру ответа без обработки (не подходит,чтобы создать dataframe)
schema = adapter.get_schema(raw = False)
# get_data() возвращает данные ответов с сервера в формате [<class 'dict'>]
#   по умолчанию (пустые скобки), payload берется из конфигурации
data = adapter.get_data()
#   При наличии payload (get_data(payload)) у сервера запрашиваются конкретные в payload данные.
payload = [{"query": 123}, {"query": 456}, {"query": 789}]
results = adapter.get_response(payload)

Использование с контекстным менеджером

# возможность докачки данных вне конфигурации
with REST2JSON(config) as adapter:
	 # Работа с адаптером
    response = adapter.get_data({})
    print(response)
    # Автоматическое закрытие соединений

Пакетная обработка

payload = [{"query": 123}, {"query": 456}, {"query": 789}] # API-сервис ожидает параметр c именем query

with REST2JSON(config) as adapter:
    results = adapter.get_response(payload)
    for result in results:
        print(result)

#или
adapter = REST2JSON(config)
response = adapter.get_response(payload)
for result in response:
        print(result)

Конфигурация

Структура конфигурации

# обязательный: параметры процесса
# (основные настройки)
proc:
  # обязательный: конфиг источника

  src:
    # обязательный: наименование источника
    name: "getEverything" #
    # обязательный: тип подключения
    #   определяет, как мы читаем источник
    conn_type: 'rest2json' 
    # обязательный: список параметров подключения
    conn_params:
      # опциональный: количество ретраев и таймаут
      #   если не указать -- 1 ретрай и какой-нибудь таймаут
      retries: 3
      timeout: 30  

      # обязательный: спецификация сервиса
      # (хотя бы один из двух должен быть указан и заполнен) 
      #   отсюда берём схемы реплаев,
      #     + url для запроса, если возможно

      spec_url: 'https://dadata.ru/files/openapi/suggestions.yml'
      spec_data: 
      # опциональный: адрес для запроса 

      base_url: "https://suggestions.dadata.ru/suggestions"
      # опциональный: ep+method для случаев, когда сервис не использует operation_id
      endpoint_url: "/api/4_1/rs/suggest/bank"
      method: 'post'
      # опциональный: перебор страниц на сервере
      #   игнорим, если параметра нет,
      pagination:
        # обязательный: включение
        enabled: false
        # обязательный: название параметра с номером страницы
        page_param: 'page'
        # обязательный: название параметра с размером страницы
        pagesize_param: 'per_page'
        # обязательный: запрашиваемый размер страницы
        pagesize_val: 100
        # обязательный: название параметра с общим числом записей
        pagecnt_param: "total_results"

    # обязательный: конфиг данных (схема, фильтры, etc)
    data:
      #   TODO: использовать динамическую генерацию запросов по спеке,
      #     и как-то угадывать, куда какие параметры писать -- нецелесообразно
      payload: 
              ['query': 'SABRRUMM', 'query': 'VTBRRUMM',]
	# опциональный: свой маппинг типов
	  json_mapping_override:
	  	"null": "null"
      
# обязательный: данные для авторизации
# содержат только логины, токены, пароли
auth:
  # источник (extract)
  src:
    header: # авторизация через хедер (как в dadata)
      "Authorization":  "Token "
      "X-Secret": ""
      #X-Secret: "64545645"
    body: # авторизация через параметр в теле (как в random.org)  
      #- "API_KEY: 12434547985675"
env:
	# опциональный:  маппинг типов данных (при конвертация в StrucType-json)
  json:
    type_mapping:
      int32: integer
      int64: long
      float: float
      double: double
      date: string
      date-time: string
      binary: binary

Class Reference

Класс REST2JSON

Основной класс для работы с API.

Методы

get_data(data=None)

Основной метод для выполнения запросов. Автоматически управляет контекстом.

Параметры:

  • data - Данные для запроса. Может быть:

    • None - запрос без параметров,в таком случае данные для запроса берутся из конфигурации (раздел proc.src.data.payload)
    • dict - одиночный запрос (может быть пустым - {})
    • list[dict] - пакет запросов (может быть пустым - [])

Возвращает: JSON ответ от API или список ответов при пакетной обработке.

get_schema(raw = False)

Возвращает:  схема структуры данных из OpenAPI спецификации при raw = False возвращает схему в Spark-формате.

Обработка payload

Для получения ответа от API сервиса необходимо передать в запрос параметры, которые он ожидает — обычно это идентификаторы, фильтры или данные для создания/обновления объектов. Они могут быть переданы как часть URL (например, /users/123), в строке запроса (?page=2) или в теле запроса (JSON с полями).

Параметры требуется указать все параметры явно:

data = {"query": 123,"status":["ACTIVE"],"type":["BANK","BANK_BRANCH","OTHER"]}

Пример requestBody в спецификации

requestBody:
    content:
       application/json:
         schema:
			required:
				- query
			type: object
			properties:
				count:
					type: integer
					format: int32
					nullable: true
					default: 10
				locations:
					type: array
					nullable: true
					items:
						$ref: "#/components/schemas/LocationCode"
				locations_boost:
					type: array
					nullable: true
					items:
						$ref: "#/components/schemas/LocationCode"
				query:
					type: string
				status:
					type: array
					nullable: true
					items:
						type: string
						enum:
							- ACTIVE
							- LIQUIDATING
							- LIQUIDATED
							- REORGANIZING
							- BANKRUPT
				type:
					type: array
					nullable: true
					items:
						type: string
						enum:
							- BANK
							- NKO
							- BANK_BRANCH
							- NKO_BRANCH
							- RKC
							- CBR
							- TREASURY
							- OTHER
Тип входных данных Результат
{},[],'' [dict] - одиночный запрос(сервер не ждет данных)
dict [dict] - одиночный запрос
list[dict] list[dict] - пакет запросов

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rest2json-0.3.1.tar.gz (33.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

rest2json-0.3.1-py3-none-any.whl (33.5 kB view details)

Uploaded Python 3

File details

Details for the file rest2json-0.3.1.tar.gz.

File metadata

  • Download URL: rest2json-0.3.1.tar.gz
  • Upload date:
  • Size: 33.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for rest2json-0.3.1.tar.gz
Algorithm Hash digest
SHA256 76f6d365d74b4637b3a55078a5c80adb63b3ac8a9f713c17c85060904361f818
MD5 0331eb8a3008634a3e16e1b0b5fd1300
BLAKE2b-256 37116e67263f994fb5e9aa204d5bed19057f56ab303c372266ffb0c9bda2b70f

See more details on using hashes here.

File details

Details for the file rest2json-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: rest2json-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 33.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for rest2json-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 b856df0bdc1433ceb3cd918b7be3785f333315a8c1a42e35ae2b8ee14e938c2d
MD5 3bb8c9acb0a544f49543dbfc362c498e
BLAKE2b-256 1d5f285f5fe99f994e2297d003794b56775c6df051cacc109fbeeb5ab8a561b2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page