Valeriy Maslennikov
Valeriy Maslennikov
  • 7
  • 58 736
КАК СПРОЕКТИРОВАТЬ ХОРОШИЙ API: 20 ЛУЧШИХ ПРАКТИК
В этом видео обсудим, что же такое проектирование API и зачем оно надо, а потом я поделюсь с вами целой кучей лучших советов по проектированию API, оформленных с хорошими и плохими примерами для наглядности.
Делись в комментах своими советами!
Telegram t.me/geekinsideme
00:27 - Введение
01:20 - О чем мы говорим?
02:00 - Зачем проектировать API
03:11 - Лучшие практики: HTTP Протокол
06:46 - Лучшие практики: Нейминг и URL
11:37 - Лучшие практики: Дизайн API
15:55 - Лучшие практики: Инфраструктура
21:45 - Лучшие практики: Безопасность
27:10 - Outro
มุมมอง: 41 281

วีดีโอ

Создаём локального AI помощника в терминал на C# (Phi-3 model на CPU)
มุมมอง 2K7 หลายเดือนก่อน
Создаём локального AI помощника себе в терминал, работающего прямо на CPU с помощью новой Phi-3 модели от Microsoft, анонсированной на последнем Microsoft Build 2024. Такая cli tool отлично подходит в качестве помощника как для опытных разработчиков, чтобы вспоминать забытые команды или особенности синтаксиса, так и новичкам, которые хотят изучить возможности терминала. Подписывайтесь на Telegr...
Response Compression в ASP.NET C# - А ЧТО, ТАК МОЖНО БЫЛО?
มุมมอง 3.8K10 หลายเดือนก่อน
👋🏻 Привет, меня зовут Валера Масленников. Сегодня поговорим о компрессии. Моя телега, там польза и мемасы ➡️ t.me/geekinsideme 0:00 Зачем нужна компрессия? 1:10 Где она должна быть? 2:12 Включаем компрессию 4:28 Security issues 5:25 Настройки компрессии 10:35 Защита от CRIME & BREACH
5 MUST HAVE NuGet для Junior C#
มุมมอง 1.3K11 หลายเดือนก่อน
👋🏻 Привет, меня зовут Валера Масленников. В этом видео мы рассмотрим топ 5 nuget пакетов, которые я считаю must have для каждого junior разработчика, работающего с .NET. Подписывайтесь на Telegram, я там пишу много всего интересного: ➡️ t.me/geekinsideme Документации по нугетам: System.Text.Json: learn.microsoft.com/ru-ru/dotnet/standard/serialization/system-text-json/overview Json.NET: www.new...
.NET 8 NEW FEATURES: TimeProvider - класс для работы со временем | Часть 2
มุมมอง 1.6Kปีที่แล้ว
👋 Привет, меня зовут Валера Масленников. В этом видео мы продолжаем рассматривать новые функции, добавленные в 8-й версии .NET. В этом видео мы обсуждаем новые абстракции для работы со временем, среди них: TimeProvider и ITimer. Другие видео о новинках в .NET 8: 1️⃣ Новые метода рандома: th-cam.com/video/LMWTCv0vWYM/w-d-xo.html Полезные ссылки: ➡️ Описание новых абстракций от Microsoft: learn.m...
.NET 8 NEW FEATURES: Новый Random и не только! | Часть 1
มุมมอง 2.8Kปีที่แล้ว
Привет, меня зовут Валера Масленников. В этом видео мы начнём рассматривать новые функции, добавленные в 8-й версии .NET. Начнём с долгожданных новых методов класса Random - Shuffle и GetItems, а также обновлениях в классе RandomNumberGenerator. Полезные ссылки: ➡️ Подробнее о Span и его роли в оптимизации работы с памятью в .NET: learn.microsoft.com/ru-ru/dotnet/api/system.span-1?view=net-8.0 ...
Cancellation Token в C# | Как использовать ресурсы сервера оптимально
มุมมอง 6K2 ปีที่แล้ว
- Учимся прерывать выполнение лишних действий, чтобы не тратить ресурсы - Получаем прирост производительности в пару строк кода - ??? - Profit! Документация по фильтрам: learn.microsoft.com/ru-ru/aspnet/core/mvc/controllers/filters?view=aspnetcore-7.0 Документация по middleware: learn.microsoft.com/ru-ru/aspnet/core/fundamentals/middleware/?view=aspnetcore-7.0 Оглавление: 0:00 Вступление 0:30 C...

ความคิดเห็น

  • @DlinnyLag
    @DlinnyLag 6 วันที่ผ่านมา

    Дизайн API: Совет 6 ( 14:57 ). С ним проблема. Со стороны клиента приложения - такой endpoint не особо полезен. Факт того что бакэнд приложение не работает, можно выяснить по любому запросу. Но это слабый аргумент. А вот сильный - что должно вернуться клиенту, если в момент запроса из 10 запущенных инстансов приложения бакэнда (за балансировщиком) 8 работает, 1 запускается, а 1 не работает? Где будет реализована логика проверки работает/не работает? В балансировщике? А как он поймёт, что от него программист приложения хочет? Вообще, health check лучше прятать от внешнего клиента и оставлять его доступным только(!) инфраструктурным клиентам, типа балансировщика.

    • @maslennikovvaleriy
      @maslennikovvaleriy 6 วันที่ผ่านมา

      @@DlinnyLag для получения статуса в целом по инфраструктуре используют Atlassian status или аналоги. А в целом, если у вас 10 инстансов и 2 не работают - это нормально, на то их и много. Для клиента это Healthy. В случае падения производительности из-за вывода инстансов можно сервису дать статус Degraded.

  • @rd1ua
    @rd1ua 18 วันที่ผ่านมา

    а почему «продукт не найден» с кодом 404 ? это же недоступность ресурса

  • @vertopolkaLF
    @vertopolkaLF 21 วันที่ผ่านมา

    Шрифт какой-то знакомый... Не Onest ли?

  • @AntonRyabov-by3vn
    @AntonRyabov-by3vn 25 วันที่ผ่านมา

    Это лучшее объяснение! Спасибо!

  • @ТимурСафаров-в1ч
    @ТимурСафаров-в1ч 25 วันที่ผ่านมา

    Молодец бро

  • @TheVenelo
    @TheVenelo หลายเดือนก่อน

    Я использовал users - выдача всех пользователей, а user/{id} отдача конкретного. И посчитал что так интуитивнее понятнее) Но сейчас понимаю, что по сути и верно было множественное и из него выборка уже... Но уже 3 версии продукта прошло и менять этого конечно никто не будет

  • @JohnDoe-fv5cu
    @JohnDoe-fv5cu หลายเดือนก่อน

    А еще лучше использовать кебаб кейс, вместо кемел или снейк кейса. Это банально красивее выглядит в пути эндпоинта

  • @alekseyshibayev5243
    @alekseyshibayev5243 หลายเดือนก่อน

    Что не понятного в GET/ POST /delete/{id}? Что прям limit и offset? Это sql понятия. Почему не page и size?

  • @asedael5519
    @asedael5519 หลายเดือนก่อน

    По поводу ошибок на 4 минуте - вообще не согласен. Если у тебя очень много ошибок, для которых не всегда подходит тот или иной код http, то лучше и проще всегда отдавать 200 код, который символизирует, что запрос был обраюотан, если нет -500, а далее уже смотрим в тело ответа и отдаём клиенту. Пример такой реализации использует Cloudflare и др компании

  • @Toksi86
    @Toksi86 หลายเดือนก่อน

    Отличное видео, спасибо за работу. Вроде большинство из этого уже известно, но из-за того что опыта пока мало все в голове тяжело удержать, надо периодически повторять :)

  • @stanislavsh6582
    @stanislavsh6582 หลายเดือนก่อน

    Про коды - откровенная лажа. Эти коды относятся к веб-серверу. Если код дошел до обработчика - никакого ответа кроме 200 быть не должно. Почему? Потому что опять - а как твой клиент поймет, это 404 из-за того что nginx на балансировщике отдал, или юзера нет в БД? А никак, он все равно должен будет полезть в тело. А если он и так лезет в тело - на кой фиг ты отдаешь код который относится фиг пойми к чему? Вот зачем? Вот что ты этим хочешь достичь? Далее, вся эта фигня с "рестфул" ведет к тому, что у тебя по сути каждый эндпоинт может разный формат сообщения отдать, ведь с точки зрения рест - это разные ресурсы. Офигенно же. В результате - у тебя юзеры отдаются так, товары эдак, а теги вот так вот. Это конечно в крайнем случае, но не суть. А суть в том, что не натягивайте HTTP на приложение. Оно не для этого придумано, протокол HTTP придуман для веб-сервера непосредственно, ваше приложение - оно уже за веб-сервером. У него должны быть свои коды. И если до вас дошел запрос - альтернативы кроме как отдать 200 быть не должно. Потому что - ну, а чего бы тогда коды TCP для информирования об ошибках не использовать? Шли RST и кайфуй) Плюс - дальше - ваше приложение надо будет выносить за HTTP, на какой-нибудь jsonRPC или еще что-то. Че делать будем? Переделывать половину инфраструктурной части, чтобы тот же, в рамках приложения, но отличающийся транспортом запрос? Ну не бред ли? Короче. Пилишь веб-сервер - используешь коды HTTP для ответа. Если пилишь приложение - всегда возвращаешь 200 и не насилуешь мозги ни себе ни людям.

  • @ВладРоманов-ю8л
    @ВладРоманов-ю8л หลายเดือนก่อน

    Пожалуйста делай по больше таких видео, не концентрируйся на C#)

  • @kolosok5465
    @kolosok5465 หลายเดือนก่อน

    Про безопасность. Работали с одним сервисом, и нам нужно было получить список их пользователей. Там было два эндпоинта, один возвращает только имя, id, и несколько вспомогательных полей, а второй возвращает вообще все, вплоть до паспортных данных. Мне их разработчик говорит, вот вам токен авторизации, вам нужно использовать только первый эндпоинт, а я просто для интереса попробовал использовать второй, и да, я просто получил список их пользователь с кучей конфедециальной информации. Побежали исправлять, оказалось, что "ограниченные" токены авторизации, которые они дают своим партнёрам, давали доступ АБСОЛЮТНО ко всему.

  • @fenix_1851
    @fenix_1851 หลายเดือนก่อน

    Очень круто! Кликнул на видео с мыслью освежить знания и не пожалел, структурированно и по делу, подписался :)

  • @9285550
    @9285550 หลายเดือนก่อน

    Глаголы это, конечно, хорошо, но в крупных проектах лучше всего подходит json Api, пост на всё и 200 на всё, а ошибки в теле ответа. Да и вообще grpc намного удобнее, особенно если сервисов дохрена. Работаю в бигтехе, знаю о чем говорю.

    • @Pokaznoy
      @Pokaznoy หลายเดือนก่อน

      В каком именно бигтехе так принято? И чем 200 на все лучше понятной ошибки ?

    • @9285550
      @9285550 หลายเดือนก่อน

      @Pokaznoy тем, что не смешиваются транспорт и логика. С 404 не понять - нет запрошенной сущности (логика приложения) или нет такой страницы (проблемы транспорта).

  • @9285550
    @9285550 หลายเดือนก่อน

    И тут аштитипи. Какое аш, вы поехавшие все что ли?

  • @mt89vein
    @mt89vein หลายเดือนก่อน

    Вместе с 429 принято возвращать заголовок Retry-After, который идет по стандарту. Так многие клиенты смогут автоматически подождать и не перенастраивать на ваши кастомные заголовки

  • @KALWHSE
    @KALWHSE หลายเดือนก่อน

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

  • @legrontik
    @legrontik หลายเดือนก่อน

    Я хз кто ты, но ты хорош. Все что хотел сказать, но не мог сформулировать

  • @timur2887
    @timur2887 หลายเดือนก่อน

    Спасибо, неплохо было проговорить все это в качестве напоминания

  • @SuperOsa777
    @SuperOsa777 หลายเดือนก่อน

    11:05 Как парсить потом форматы дат? У нас на входе строка с содержимым 2023-03-15 (...Хоть что...) Не проще передавать сразу ISO строку без дополнительных единиц измерения? (ну и конечно применить валидацию на ISO строку) Мы можем измерить массу в кг и фунтах, но дату передавать в любом виде, кроме как ISO строка - идея так себе, поэтому обозначение в скобках просто избыточно

    • @maslennikovvaleriy
      @maslennikovvaleriy หลายเดือนก่อน

      @@SuperOsa777 iso date format это подпись от меня, а не часть передаваемой строки :)

    • @SuperOsa777
      @SuperOsa777 หลายเดือนก่อน

      @@maslennikovvaleriy тогда окей, а то вдруг кто-то бы строкой это передавал...

  • @jonkarmok1840
    @jonkarmok1840 หลายเดือนก่อน

    Стоило рассказать, где имеет смысл применять Rest, особенно соответствующий Restful

  • @alexandrserov6066
    @alexandrserov6066 หลายเดือนก่อน

    Как-то сумбурно В начале написано restful, а описывается rest api, игнорируя последние три буквы . При этом первым пунктом в бестпрактис - это используйте GET/POST/PUT/DELETE - а это собственно есть последние три буквы. Т.е. REST - это формат обмена, т.е. json поверх HTTP, а RESTful - это уже способ проектирования апи, на основе REST. Кэширование - не являются частью API, как и Rate Limiter, тоже не являются, но раз уж о них, то где circuit breaker? Про пароли в теле запроса, дело ни в том, что в теле запроса оно лежит безопасней, тело запроса точно также логируется на проксисервере, там в целом весь запрос логируется, дело в том, что во первых метод логина - не иденпотентен и не может быть GET по условиям RESTful, а во вторых - дело в том, что методы GET и POST обычно имеют разную политику обработки на уровне маршрутизации и безопасности (даже на уровне CORS это сделано). Если авторизация сделана через GET, логин и пароль можно увести через простую ссылку, хоть на картинку в обычном html

    • @abbze8272
      @abbze8272 หลายเดือนก่อน

      Те же вопросы возникли, согласен. Накрученные комменты с благодарностями так же вводят в заблуждение, думаешь что норм материал.

  • @АнтонВоронов-ы9ц
    @АнтонВоронов-ы9ц หลายเดือนก่อน

    0:03 Тема про API (не Web API). 0:33 Говорит о Web API, тут же называя его API. 1:04 говорит о WEB API. 1:24 Далее задается вопросом зачем нужно проектировать API (видимо имел ввиду WEB API), но объясняет зачем нужны API в принципе, перечисляя максимально абстрактные цели, причем на максимально далеком от практики примере. 5:14 "клиента отправляют к поддержке". Тут понятие клиент из архитектуры перепутано с понятием клиент из договора. 7:05 Говорит: "использование множественных чисел", имея ввиду существительные во множественном числе. 18:45 "масштабировать производительность" - одно слово лишнее. Выглядит так, что все что нашел в интернете по ключевыми словами, то и написал, а то что это разные понятия с похожими ключевыми словами - это не так важно. Мешанина из понятий Web API и API, клиентское приложение и клиент в юридическом смысле. Говорит об API, хотя имеет ввиду WEB API и прыгает с одного на другое.

    • @WTF21ful
      @WTF21ful หลายเดือนก่อน

      Столько слов написано, а по делу ничего

  • @alexandreev2752
    @alexandreev2752 หลายเดือนก่อน

    Очень качественный материал, спасибо за потраченное на создание время! Я по профессии QA, мне оказалось полезным, то что надо, чтобы разложить разрозненные знания по полочкам и вспомнить то, что знаю, но забыл!

  • @denissaveliev2664
    @denissaveliev2664 หลายเดือนก่อน

    Удобно, скрншотами можно сохраннять советы

  • @extressar679
    @extressar679 หลายเดือนก่อน

    Один из лучших видосов что я смотрел по теме, крайне приятно смотреть и крайне полезно, прям хочется сделать шпаргалку

  • @Zeptonixmusic
    @Zeptonixmusic หลายเดือนก่อน

    Если бы у всех туториалов была такая подача, у нас бы уже были летающие машины

  • @exoneges
    @exoneges หลายเดือนก่อน

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

    • @maslennikovvaleriy
      @maslennikovvaleriy หลายเดือนก่อน

      @@exoneges C# чаще всего, иногда JS, если надо быстро сделать что-то маленькое

  • @twokrangs
    @twokrangs หลายเดือนก่อน

    Спасибо за видео, очень полезно )

  • @SouthernRedneck-pn5pd
    @SouthernRedneck-pn5pd หลายเดือนก่อน

    Самое главное это делать спецификацию до имплементации. Например использовать openAPI (swagger) где все подробно описать, какой запрос и какой ответ ожидать. Так же делать маппинг документ где четко документированы детали и диаграмма операций каждого ендпойнта, это очень поможет клиентам вашего приложения и разработчикам. Без этой основы, в коде будет бардак и чем дальше, тем больше спагетти кода появится, дольше добавлять нововведения и создавать дополнительные баги.

  • @KH93b_
    @KH93b_ หลายเดือนก่อน

    17:30 - вот так делать не надо точно. Атакующие зная значения rate limit подстроят их так , что их переатанет срезать.

  • @makofguitar
    @makofguitar 2 หลายเดือนก่อน

    Отличное видео! Очень полезно.

  • @TheLastSeason
    @TheLastSeason 2 หลายเดือนก่อน

    Спасибо! Я фронтенд-разработчик, мимо проходил) Видео понравилось, четко структурировано, понятно и с примерами.

  • @aydinkassymkhan3730
    @aydinkassymkhan3730 2 หลายเดือนก่อน

    Сделайте видео как и где правильно использовать exceptions

  • @alla6361
    @alla6361 2 หลายเดือนก่อน

    Спасибо, очень четко! Помог разобраться.

  • @d_r_robot
    @d_r_robot 2 หลายเดือนก่อน

    Почему Джарахов рассказывает про api?

  • @caymansf3216
    @caymansf3216 2 หลายเดือนก่อน

    Супер полезное видео. Буду теперь всех джунов сюда отсылать, чтобы не объяснять самому одно и тоже.

  • @ketuser9634
    @ketuser9634 2 หลายเดือนก่อน

    слушайте, где вы берете это‘аш’ в http, что это вообще аш ? аш мля 😅

    • @maslennikovvaleriy
      @maslennikovvaleriy 2 หลายเดือนก่อน

      Старая привычка, но вы правы :)

  • @TechnoBog-ov2mp
    @TechnoBog-ov2mp 2 หลายเดือนก่อน

    Не очень согласен с советом об иерархической связи ресурсов. Реальный пример: был проект интернет-магазин. В нем были категории, в категориях продукты, в продуктах вариации, в вариациях характеристики. Гет на получение характеристик выглядел так: GET /categories/{id}/products/{id}/variations/{id}/specifications Здесь лишь последний айди реально имеет смысл - айди вариации продукта. Проверять правильность иерархии на бэкэнде не было смысла, поэтому просто брался последний айди и по нему шел запрос в базу данных, а вот с точки зрения фронта необходимость поддерживать 3 айди выливалась в бесполезный код. Поэтому решили остановиться на более простом варианте: GET /product-specifications?variation_id={id}

  • @ГубкаБоб-р8ъ
    @ГубкаБоб-р8ъ 2 หลายเดือนก่อน

    Спасибо, интересно, полезно, без воды! Лайк, подписка и колокольчик 💪

  • @niknt
    @niknt 2 หลายเดือนก่อน

    Большое вам спасибо за такое полезное видео! Очень понравилось 😊

  • @HalabSamani
    @HalabSamani 2 หลายเดือนก่อน

    Спасибо за информативный и познавательный контент! Привет из солнечного Узбекистана🇺🇿

    • @maslennikovvaleriy
      @maslennikovvaleriy 2 หลายเดือนก่อน

      Привет! И вам спасибо :)

  • @maslennikovyv
    @maslennikovyv 2 หลายเดือนก่อน

    Буду использовать как "настольную книгу" и пересматривать каждый, раз когда буду начинать новый проект, спасибо!

  • @practical-skills-school
    @practical-skills-school 2 หลายเดือนก่อน

    Отдельно напишу коммент по содержанию. Все обстоятельно. Мне не хватило, пожалуй, про передачу данных. В каком случае это делать в заголовках, в каком - в теле запроса, в каком - через адресную строку. Я знаю мало, и мне бывает интересно, почему одни полагаются на заголовки, а другие на body. И например, гет- запросы не должны передавать данные в теле, хотя такое технически возможно.

    • @KH93b_
      @KH93b_ หลายเดือนก่อน

      У Get нет body, соответственно в URL передавать параметры запроса. В заголовках передается или JWT токен аутентификации или куки. POST, PUT,PATCH - передаём в Body. Delete тут не уверен, иногда достаточно URL, иногда нужно в теле указать что удалять.

    • @romankuznetsov4601
      @romankuznetsov4601 หลายเดือนก่อน

      Иногда для получения информации вы должны передать очень много информации и тогда GET не очень хорошая идея, лучше заюзать POST и в теле перечислить ваш бесконечный список условий, например. Однако это обязательно должно быть нормально документировано

    • @practical-skills-school
      @practical-skills-school หลายเดือนก่อน

      @romankuznetsov4601 спасибо

  • @practical-skills-school
    @practical-skills-school 2 หลายเดือนก่อน

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

    • @maslennikovvaleriy
      @maslennikovvaleriy 2 หลายเดือนก่อน

      @@practical-skills-school больше спасибо!

    • @sir_incognito
      @sir_incognito 2 หลายเดือนก่อน

      Согласен, как шпаргалка для разработчика

  • @ibraim3197
    @ibraim3197 2 หลายเดือนก่อน

    Слабо, очень слабо. По сути контент ради контента, а тема не раскрыта вовсе. Сначала автор лил воду, рассказывая что такое RestAPI, потом прошелся по про всем очевидные вещи, известные всем, такие так http заголовки и нейминг и даже там тему не раскрыл. Во первых использовать get для модифицирующих операций нельзя в первую очередь из соображений безопасности, а не приверженности дизайну (я могу скинуть ссылку залогиненому пользователю и перейдя по ней он непроизвольно выполнит действие) С неймингом все сложнее когда у вас нетривиальный пример ( нука скажите как должен выглядеть метод запуска ракеты ) Ну и самое главное, о чем не было сказано ни слова: одного rest недостаточно для спецификации, поэтому поверх него есть какая-нибудь OData или кастомный протокол, который единообразно описывает как должны выглядеть query params для фильтрации, респонсы с пагинацией и метаинформацией

    • @maslennikovvaleriy
      @maslennikovvaleriy 2 หลายเดือนก่อน

      Вам больше книжный формат подойдет :)

  • @Vandomas
    @Vandomas 2 หลายเดือนก่อน

    Прекрасное видео! Спасибо большое, жду ещё подобные видео.

  • @popuguytheparrot_
    @popuguytheparrot_ 2 หลายเดือนก่อน

    Балансировщик настроить еще надо. И запросы должны иметь липкие сессии, чтобы не ходили в другие сервера. Тут не все так просто. Это целый пласт инфы

    • @MrBoBrilO
      @MrBoBrilO 2 หลายเดือนก่อน

      Это две строчки кода)

    • @maslennikovvaleriy
      @maslennikovvaleriy 2 หลายเดือนก่อน

      @@popuguytheparrot_ спасибо за коммент! Настроить - да, хотя сейчас есть куча готовых вариантов вроде HAProxy, где достаточно небольшого конфигурационного файла для начала балансировки. А липкие сессии не нужны, если вы придерживаетесь REST подхода, ведь он подразумевает, что сервер не хранит информацию о запросах между сессиями. Кстати, в телеге расписал некоторые распространенные алгоритмы балансировки, если вдруг интересно :)

  • @TalosDx
    @TalosDx 2 หลายเดือนก่อน

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