Обновить
128K+

Проектирование API *

О создании API

41,79
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Алгоритм был правильным. Ошибка была в контракте графа

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели5.3K

Мне нужен был сервис, в котором должны были работать несколько разных алгоритмов. Часть математики я помнил, часть понимал поверхностно, часть собирался восстановить по ходу работы. Чтобы быстрее получить прототип, я подключил LLM к генерации бойлерплейта, интерфейсов и первых реализаций.

Через несколько дней (говно)кода стало много — вменяемого сервиса не получилось.

Один BFS принимал map[string][]string. DFS жил на другом типе графа. В одной реализации направленность задавалась на уровне графа, в другой вытекала из того, как было записано ребро. Опции существовали, но их комбинации не образовывали понятной политики. Result types возвращали срезы и числа, однако я не мог внятно ответить, что именно они гарантируют.

Проблема была не в том, что LLM «не умеет BFS». Я попросил реализации раньше, чем сформулировал общий контракт данных. Генератор заполнил пустые места правдоподобными допущениями — которые, очевидно, не совпали в разных кусках кода.

Исходный сервис я остановил. Дальше пришлось вернуться к математике, разобрать алгоритмы по отдельности и сначала спроектировать фундамент, на котором они вообще могут сосуществовать. ...решение смелое и честно говоря не самое лёгкое.. и совершенно не дооценённое

Спуститься на уровень архитектуры

Новости

Восемь раз я думал, что сломал код. Это была платформа

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели5.2K

В начале августа я сел делать игру для мессенджера MAX – обычный вордли, слово из пяти букв, шесть попыток. Мини-приложение на ванильном JS, сервер на Go, самый дешёвый VPS. По моим прикидкам – три вечера.

Первый вечер целиком ушёл на то, чтобы сервер вообще смог поговорить с API мессенджера. Не на игру, не на словарь – на TCP-соединение.

Дальше было ещё семь таких мест. Каждое выглядело как мой баг, каждое оказалось особенностью платформы, и ни одного из них нет в документации. Ниже – все восемь, с кодом и с тем, как именно я до них дошёл. Игра тут нужна только как повод: она набрала 107 игроков за пять дней, это скромно, и рассказывать я собираюсь не про неё.

Читать далее

6 AI-сервисов, которыми сейчас можно пользоваться бесплатно или почти бесплатно

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели7.7K

Собрал шесть AI-сервисов, которыми сейчас можно пользоваться бесплатно или с крупными стартовыми кредитами: FLUX 3 для генерации видео, Manus, Postman Agent Mode, Claude через API, Atomesus и Deepgram с $200 на Voice AI. Проверил регистрацию и условия на своих аккаунтах, добавил скриншоты и короткие инструкции. Актуально на 12 августа 2026 года.

Читать далее

SOP & CORS

Уровень сложностиПростой
Время на прочтение13 мин
Охват и читатели8.5K

Держите открытыми две вкладки. В одной — интернет-банк, куда вы залогинены и где на экране висит ваш баланс. В другой — какой-то сайт, на который вы забрели по ссылке из выдачи, ничего особенного. Теперь вопрос, который на первый взгляд кажется надуманным, а на деле упирается в фундамент всей веб-безопасности: что мешает скрипту со второго сайта взять и прочитать ваш баланс из первого?

Читать далее

Чему мы научились, написав на Rust среду выполнения для TypeScript

Время на прочтение17 мин
Охват и читатели8.5K

Encore зародился как фреймворк на Go, и на Go там были написаны среда выполнения, интерфейс командной строки (CLI), парсер и компилятор. Когда мы решили поддерживать TypeScript, логичнее всего было бы написать на TypeScript и среду выполнения тоже, либо достроить к среде выполнения Go какой‑нибудь мостик. Но в итоге пришли к тому, что написали новую среду выполнения с нуля на Rust.

Читать далее

Агентская разработка и Documentation Driven Development: когда ИИ пишет не код, а контракты

Время на прочтение9 мин
Охват и читатели6.3K

Привет, Хабр! Я Матвей Лихота, старший Go-разработчик. В предыдущем материале я показывал, как получить Go-код из OpenAPI. Теперь хочу сделать еще один шаг назад — к моменту, когда контракта еще нет.

На демо частенько можно увидеть, как по простому запросу «напиши CRM» или «собери интернет-магазин» LLM уже через минуту готовит сервер, модели, миграции и тесты. Но в реальности, конечно, все происходит чуть иначе: проверяем код, а там — сюрприз-сюрприз ошибки. Повторив тот же промпт, мы получим другую архитектуру и снова потратим время на проверку. И нет гарантии, что после переделки ошибок не станет еще больше.

Конечно, все дело в промпте. Согласитесь, странно просить модель понять задачу, выбрать архитектуру, определить границы и все реализовать за один шаг? Что, если LLM сначала проектирует систему и выпустит OpenAPI, Proto, JSON Schema, CloudEvents и AsyncAPI? А код мы добавим чуть позже: за повторяемую часть будут отвечать обычные генераторы, а за проектно-зависимую — разработчики и агент в контексте репозитория.

Такой подход, где главным артефактом становится контракт, а код — его производной, можно назвать Documentation Driven Agent Development или Specification Driven Agent Development. Как он работает — покажу на примере разработки простой автоматической телефонной станции (АТС), а еще проведу границу между генераторами и агентами.

Читать дальше

NEOMSA APIM 4.6.0, платформа управления API: как мы устранили уязвимости Critical и High из БДУ ФСТЭК

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели9.6K

Мы выпустили NEOMSA APIM 4.6.0. Основной фокус этого релиза — повышение безопасности состава поставки платформы.

В рамках процессов безопасной разработки (SSDLC) мы сформировали SBOM, проверили компоненты и их зависимости на известные уязвимости (SCA), сопоставили результаты с БДУ ФСТЭК России и обновили проблемные библиотеки. По итогам повторной проверки количество зарегистрированных находок сократилось с 57 до 7. Уязвимостей уровней Critical и High в финальной сборке не осталось.

В статье рассказываем, как устроена проверка NEOMSA APIM перед выпуском и какой критерий безопасности мы используем для принятия решения о готовности релиза.

Читать далее

Как я перенёс проверку цен с VPS на компьютеры пользователей — и зачем всё-таки оставил сервер

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели7.7K

Сначала PriceTrack проверял страницы маркетплейса на VPS. Селекторы были корректными, но сервер вместо карточек товара получал 403. В итоге я перенёс браузер и извлечение данных на компьютеры пользователей, а сервер оставил управляющим контуром. В статье рассказываю, как устроена эта архитектура, зачем понадобились базовый профиль и локальный рецепт и какие проблемы появились с фоновыми проверками, треем и несколькими аккаунтами.

Читать далее

Wiremokjs как я создавал свой скриптовый язык для wiremock

Уровень сложностиСредний
Время на прочтение45 мин
Охват и читатели9.8K

В этой статье я расскажу, как создавал скриптовый язык WiremockJs — с нуля и до рабочего прототипа. Поделюсь, что меня подтолкнуло к этому «подвигу», как я проектировал грамматику, с какими ограничениями столкнулся и почему в итоге не стал использовать JavaScript, а написал свой упрощённый диалект. Под катом — ANTLR, парсеры, немного боли и много удовольствия от творчества.

Читать далее

Ваш AI‑агент не ошибся. Он точно выполнил плохую спецификацию

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели8.3K

Почему API-First уже недостаточно и что меняется, когда SDD строится на .md-файлах и обязательном участии агентов?

В агентном SDD спецификация становится не пояснением к коду, а рабочим контекстом, из которого агент строит план, тесты и реализацию. Это ускоряет разработку — и одновременно увеличивает цену неоднозначности. Разбираем, как превратить .md из документации в управляемый контракт.

Читать далее

Как облегчить переезд бота из Telegram в MAX

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели9.7K

В связи с тем, что Павел Дуров теперь террорист, Telegram скоро признают экстремистской сетью, что окончательно выведет бизнес в черную зону. Несмотря на то, что мы видим, как до сих пор всё прекрасно работает в соц.сети с картинками, важно перестраховаться. Поэтому сейчас, чтобы “обелиться”, многие бизнесы и эксперты переезжают или будут переезжать в другие соц.сети, в том числе в тот, который ловит даже на парковке

Если вам кажется, что для перевода бота с Telegram на МАХ достаточно пары кликов: получить токен, поменять адрес API и подключить прежние обработчики, то, к сожалению, все не совсем так. Обычно это намного сложнее, ведь у платформ отличаются события, кнопки, медиа, работа с мини-приложениями и идентификаторами.

А если вам не повезло и в проекте намешаны бизнес-логика и код конкретной платформы, то скорее всего, надо будет написать практически нового бота

Читать далее

Один платёж — один чек: идемпотентность в интеграции с «Мой налог»

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели8.6K

Я делаю сервис по подписке и плачу налог как самозанятый. Пока платежей было три в день, чеки в «Мой налог» можно было выбивать руками. Когда они пошли круглосуточно, понадобилась автоматика — и выяснилось, что сложное в этой задаче не API налоговой, а один вопрос: что делать, когда запрос ушёл, а ответ не вернулся. Повторить — риск выдать человеку второй чек на ту же сумму. Не повторить — риск не выдать вовсе.

Рассказываю, как устроена защита от двойного чека: почему у сетевого вызова три исхода, а не два, зачем флаг попытки взводится до обращения к ФНС одним атомарным запросом и кто подбирает платежи за упавшим процессом. Плюс два бага, которые я поймал уже после запуска: один мог привести ровно к тому второму чеку, от которого всё и строилось.

Читать далее

Избавляемся от потерянных событий в микросервисах — как я написал свой Spring Starter для Outbox/Inbox

Время на прочтение12 мин
Охват и читатели7.8K

Всем привет! Меня зовут Григорий, и недавно при разработке своего микросервисного приложения я нашёл уязвимость — сообщения, пересылаемые между сервисами, имели высокий риск быть необработанными. Решением стал паттерны Outbox и Inbox. Однако, когда я стал их реализовывать во всех приложениях, то понял, что просто копирую и вставляю код. Чтобы это исправить, я решил написать свой стартер.

Читать далее

Ближайшие события

350+ моделей без смены SDK: зачем разработчику слой абстракции над LLM‑провайдерами

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели9K

Привет, Хабр! На связи команда Caila — платформы Just AI, объединяющей LLM и другие генеративные модели, включая модели для создания изображений и видео.

Мы хотим поговорить не про очередную только вышедшую нейросеть и не про то, какая модель сейчас лучше пишет код. Мы хотим поговорить про архитектурную проблему, с которой рано или поздно сталкивается любая команда, начавшая встраивать LLM в продакшен: код оказывается привязан к конкретному провайдеру, а значит, каждое появление более подходящей модели превращается в отдельную интеграционную задачу.

Читать далее

KrakenD: как мобильная логика расползлась по монолиту, а мы собрали её обратно

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели6.7K

Всем привет! Меня зовут Рома, я бэкенд-инженер в Банки.ру. Мы перевели мобильное API на KrakenD, и сейчас через него идёт весь трафик приложения.

Начиналось всё не с выбора шлюза, а с довольно неприятного открытия: логика, обслуживающая мобильное приложение, потихоньку расползлась по монолиту – причём в те его места, где её никто не ждал. Дальше расскажу, как мы туда пришли, что делали, чтобы выбраться, и во что нам обошлось внедрение новой технологии в уже работающую инфраструктуру.

Читать далее

OAuth‑сервер, который не хранит пользователей

Уровень сложностиСредний
Время на прочтение23 мин
Охват и читатели7.2K

Наш OAuth-сервер не хранит профиль пользователя и практически ничего о нём не знает. Он знает только IdP-личность («вы вошли через Google под таким-то аккаунтом»), а внутренний id, роль и имя живут в продуктовом бэкенде. Сшивают их два кастомных гранта: первый вкладывает в токен подписанный профиль, не зная его содержимого, а второй разменивает основной токен на веер узких производных, по одному на аудиторию. Кроме того, в статье объясняется, почему FedCM может создавать больше проблем, чем решать, и как эти проблемы обходятся с помощью Service Worker. Если вам интересно, как всё это работает в SaaS, прошу под кат.

Читать далее

Гибкая фильтрация EF Core с помощью Expression. Часть 2: Roslyn Source Generator

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели9.7K

Для своего пет-проекта мне понадобилась удобная система фильтрации, плюс я хотел попрактиковаться в кодогенерации Roslyn. В этой статье продолжаю рассказывать о гибкой фильтрации данных в EF Core на Exression. Расскажу как мне удалось реализовать новые фичи (строгий контракт с фронтом, операторы сравнения, автоматический null-guard) выиграв при этом в производительности в рантайме.

Читать далее

Назад в 2005-й. API-first как третья пилюля от деградации проекта под LLM

Время на прочтение19 мин
Охват и читатели9.5K

Агент отчитался: экран настроек готов. Поля редактируются, после сохранения выскакивает тост «Сохранено». Я нажал F5 — все настройки вернулись к дефолтным. Бэкенда под формой не существовало: агент выяснил это в первые минуты и вместо того, чтобы сказать мне, молча положил данные в локальный стейт и нарисовал тост. Ни один чекер из моих прошлых статей этого не поймал — и не мог: деградация пришла со шва между фронтом и бэкендом, единственной границы, через которую не проходит ни компилятор, ни анализатор зависимостей.

Под катом — как этот шов гниёт под LLM и как его чинит contract-first: генерация серверных интерфейсов и клиента из одного OpenAPI-файла, политика ломающих изменений, правило «не симулируй — расширяй контракт». Попутно — зачем возвращаться к идее, которую мы выбросили вместе с WSDL, и какая из моих проверок после всего этого молча перестала работать. Третья часть цикла, читается самостоятельно.

Читать далее

Анти‑паттерн ИИ: Смертельная триада

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели9.2K

ИИ‑агенты уже умеют читать почту, работать с документами, писать код и выполнять действия от нашего имени. Почти все громкие инциденты последних лет, начиная от промт‑инъекций и до утечек секретов и нежелательных действий, укладываются в один и тот же архитектурный анти‑паттерн.

Разбираю «Смертельную триаду» (The Lethal Trifecta): сочетание приватных данных, недоверенного контента и возможности действовать во внешнем мире. Показываю, почему проблема не в «плохих» моделях, а в устройстве современных агентных систем, какие популярные способы защиты не дают структурных гарантий и как размыкать эту комбинацию на уровне архитектуры. В конце приведён короткий обзор направлений, которые могут сделать ИИ‑агентов не только полезными, но и принципиально более безопасными.

Читать далее

Как я научил Claude заказывать продукты в Яндекс Лавке (и что для этого пришлось отреверсить)

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели13K

У Яндекс Лавки нет публичного API. А мне захотелось написать ассистенту «закажи молоко и что-нибудь к ужину» — и чтобы заказ реально уехал курьеру.

Рассказываю, как я отреверсил приватный веб-API Лавки прямо из браузерного трафика и завернул его в MCP-сервер: поиск, корзина, оформление с подтверждением суммы. А главное — про грабли, которые ловил воспроизведением, а не «на глаз»: заголовок X-CSRF-Token, зашитый в HTML; гонки за общую корзину и HTTP 409; «Раскупили» и «только из Большой Лавки», которые оказались не тем, чем выглядели; пустой способ оплаты; и удалённый деплой с OAuth, чтобы заказывать с телефона.

Код открыт (MIT), ставится через uvx. Осторожно: неофициально, реверс приватного API, оформление тратит реальные деньги.

Читать далее
1
23 ...