Skip to content

Response-Validator

Валидации ответов ВК нужны от случаев когда сервер по какой-то неизвестной причине возвращает html вместо json до правильно сформированной ошибки после запроса

Стандартные валидаторы ответов

JSONValidator

Парсит json из ответа с помощью самого правого json-парсера из списка. Если вернулся необрабатываемый тип (например NoneType), то запускает Request Rescheduler, пока не будет получен валидный ответ

VKErrorValidator

Вызывает VKAPIError от CodeException при респонсе с ошибкой от вк

Создание своего валидатора ответа

Пример с response_validators из API и SomeRequestRescheduler отсюда

from typing import TYPE_CHECKING, Any, NoReturn, Union
from vkbottle import API, ABCResponseValidator
from .request_rescheduler import SomeRequestRescheduler

if TYPE_CHECKING:
    from vkbottle.api import ABCAPI, API

class SomeResponseValidator(ABCResponseValidator):
    async def validate(
        self,
        method: str,
        data: dict,
        response: Any,
        ctx_api: Union["ABCAPI", "API"],
    ) -> Union[Any, NoReturn]:
        if "error" not in response:
            return response
        if ctx_api.ignore_errors:
            return None
        if response["error"]["error_code"] != 6:
            return response
        # Обрабатываем ошибку 6, которая возникает при слишком частых запросах
        return await SomeRequestRescheduler().reschedule(
            ctx_api, method, data, response
        )

api = API("token")
# Этот валидатор должен идти после JSONResponseValidator,
# но раньше VKAPIErrorResponseValidator, чтобы он не обработал эту ошибку
api.response_validators.insert(1, SomeResponseValidator())