API вконтакте сгенерированное на основе схемы с исправленными ошибками c поддержкой корутин.
Gradle:
repositories {
maven {
url "https://dl.bintray.com/alatushkin/maven"
}
}
...
dependencies {
implementation("name.alatushkin.utils:kotlin-vk-api:0.1")
}
Пример вызова метода:
val userAccessToken = "sooo_secret
val httpClient = httpClient()
val api = MethodExecutorImpl(httpClient).withToken(userAccessToken)
val (response,error) = api(WallGetMethod(domain = "departureMsk"))
println(response)
println(error)
Выполнение до 25 одинаковых методов за один вызов:
val methodFactory = { page: Long -> WallGetMethod(domain = "departureMsk",offset = page,count = 100)}
val result: Array<VkList<WallpostFull>> = api((0..24L).map(methodFactory))
Под капотом генерируется код на VKScript и выполняется через метод "execute". В документации VK отмечается, что API методов внутри VKScript может не совпадать с внешним API. Так что всегда есть шанс, что для каких-то методов универсальный генератор работать не будет. Если встретитесь с таким - заведите isssue с подробностями.
Особенности кода: API устроен таким образом, что один и тот же метод может возвращать объекты рахных типов, в зависимости от переданных параметров. При этом хочется типизации и не хочется null-checking (some?.nullableParam).
В таких случаях для одного api-endpoint сгенерировано 2 (более методов) с соответсвующими суффиксами в именовании + жестко заданными знаечниями управляющих параметров. Для пример:
val result:VkResponse<VkList<WallpostFull>> = api(WallGetMethod(domain = "departureMsk"))
val resultExtended:VkResponse<GetExtendedResponse> = api(WallGetMethodExtended(domain = "departureMsk"))
Т.к. оригинальная схема написана неряшливо, каких-то планов по ее регулярной поддержке не озвучено, то в проекте она хранится в следующем виде:
-
Оригинальный набор файлов - сюда принимаются только минорные PR: флаги обязательности полей, потерянные поля, комментарии. Когда ВК обновит своб схему - сделать мерж будет "просто".
-
Набор патчей - концептуальные ошибки в объявлении тех или иных методов, необъявленные типы объектов и прочее. Сюда можно присылать PR для отсутсвующих объектов методов и прочее.
Кодогенерация живет в отдельном подпроекте.
Попмимо сгенерированного кода, присутсвует и некая часть вспомогательного кода, который так же нуждается в улучшениях.
Если у вас есть идеи или предложения - напишите мне в ЛС или на alexandr.latushkin@gmail.com
Что "нужно" уже сейчас:
- HttpClient - сейчас написан поверх jre. Если найдутся желающие реализовать его с использованием ktor - будет здорово (выше эффективность + шаг в сторону кросс-платформенного vk-api-client - на js у людей тоже проблемы с актуальностью)
- Заменить на что-то Jackson и перевести проект на мультиплатформенную сборку
- Доработать кодогенерацию для генерации VK-подобного api (WallGetMethod => wall.get с правильными областями видимости, чтобы не засорять неймспейс)
- Выделить кодо-генерацию и сделать автоматическую сборку через travis-ci при исправлении в json-схеме
- Посмотреть как видится в чистой java, возможно с небольшими доработками этим можно будет удобно пользовться и из java
Статус - работает "как есть". Те методы который использую в своих проектах - проверены, но вполне могут быть методы в схеме описания которых ошибка из-за чего они могту не работать - заводите issue, прикладывайте pr в схему