Как стать автором
Обновить

Популярные антипаттерны: паджинация

Время на прочтение4 мин
Количество просмотров17K

Здравствуйте, меня зовут Дмитрий Карловский и я… не люблю читать книги, потому что пока перелистываешь страницу, ты вырываешься из увлекательного повествования. И стоит чуть замешкаться, как ты забываешь на чём оборвалось последнее предложение предыдущей страницы, и приходится листать обратно, чтобы перечитать его. И если с физическими книгами это не так страшно, то вот с выдачей rest-сервера всё куда печальней — ведь сейчас на странице одни данные, а через секунду — уже совершенно другие. Давайте подумаем как же так получилось, кто виноват и главное — что делать.


Разные паджинаторы

Читать дальше →
Всего голосов 50: ↑12 и ↓38-26
Комментарии112

Apollo: 9 месяцев — полет нормальный

Время на прочтение9 мин
Количество просмотров20K

image


Всем привет, меня зовут Семен Левенсон, я работаю teamlead’ом на проекте «Поток» от Rambler Group и хочу рассказать о нашем опыте использования Apollo.


Объясню, что такое «Поток». Это автоматизированный сервис для предпринимателей, позволяющий привлекать клиентов из Интернета в бизнес, не вовлекаясь в рекламу, и быстро создавать простые сайты, не являясь экспертом в верстке.

Всего голосов 23: ↑23 и ↓0+23
Комментарии8

5 простых шагов к созданию сервера для тестирования android REST-запросов

Время на прочтение4 мин
Количество просмотров9.4K
Добрый день.

Не так давно возникла необходимость реализации в android приложении общения с API сервера посредством REST-запросов. Реализовать программную часть на android не составило большого труда, в связи с наличием удобной и простой библиотеки Retrofit. Однако, написав пару GET/POST-запросов к существующим открытым API (например, Github и прочие стандартные примеры Retrofit) возникла необходимость начать тестировать логику работы приложения. В данном случае, конечно бы хотелось иметь свой сервер, содержащий свои модели данных и имеющий взаимосвязи между моделями, а также различные уровни доступа к конкретным моделям данных. В данной статье я хотел бы рассказать, как за несколько маленьких шагов создать локальный сервер, добавить необходимые модели, настроить взаимосвязи между ними и обеспечить удаленный доступ к данному серверу.
Читать дальше →
Всего голосов 8: ↑8 и ↓0+8
Комментарии10

Опенсорс-решение для автоматизации отчетности

Время на прочтение9 мин
Количество просмотров34K
Разработчикам сайтов и мобильных приложений часто нужно управлять подготовкой PDF-страниц к выводу на печать или их отправкой клиентам на почту.

У PDF-файлов есть полный контроль над отображением текста и графическими изображениями на странице. К сожалению, библиотеки для генерации динамически заполняющихся PDF-файлов не входят в стандартный инструментарий PHP, JS (Web), Java или Swift (Android и iOS соответственно). В этой статье хочу вам рассказать об опенсорс-решении для генерации PDF-файлов.



Читать дальше →
Всего голосов 11: ↑10 и ↓1+9
Комментарии23

Автоматизация HTTP запросов в контексте Spring

Время на прочтение18 мин
Количество просмотров11K

Предыстория


Несколько месяцев назад поступила задача по написанию HTTP API работы с продуктом компании, а именно обернуть все запросы с помощью RestTemplate и последующим перехватом информации от приложения и модификации ответа. Примерная реализация сервиса по работе с приложением была таковая:


        if (headers == null) {
            headers = new HttpHeaders();
        }

        if (headers.getFirst("Content-Type") == null) {
            headers.add("Content-Type", MediaType.APPLICATION_JSON_VALUE);
        }

        HttpEntity<Object> entity;
        if (body == null) {
            entity = new HttpEntity<>(headers);
        } else {
            entity = new HttpEntity<>(body, headers);
        }

        final String uri = String.format("%s%s/%s", workingUrl, apiPath, request.info());

        final Class<O> type = (Class<O>) request.type();
        final O response = (O)restTemplate.exchange(uri, request.method(), entity, type);

… простенький метод, принимающий тип, тело и заголовки запроса. И все бы хорошо, но выглядело как костыль и не особо юзабельно в контексте Spring.


И пока товарищи коллеги писали на старом механизме функционал в своих ветках, мне пришла в голову гениальнейшая идея — а почему бы не писать эти запросы "в одну строчку" (like Feign).


Идея


У нас в руках имеется мощный DI контейнер Spring, так почему бы не использовать его функционал в полной мере? В частности инициализации Data репозиториев на примере Jpa. Предо мной стояла задача инициализация класса типа интерфейс в контексте Spring и три варианта решения перехвата вызова метода, как типичной реализации — Aspect, PostProcess и BeanDefinitionRegistrar.


Кодовая база


Первым делом — аннотации, куда же без них, иначе как конфигурировать запросы.


1) Mapping — аннотация, идентифицирующая интерфейс как компонент HTTP вызовов.


@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Mapping {
    /**
     * Registered service application name, need for config
     */
    String alias();
}
Читать дальше →
Всего голосов 11: ↑7 и ↓4+3
Комментарии6

Параллельное обновление данных в ASP.NET Web API

Время на прочтение3 мин
Количество просмотров4.5K
Хочу рассказать, как мы организовали фоновое обновление данных во время запроса к REST-сервису.

Задача следующая: система хранит данные о пользователях. Cервис работает изолированно и не имеет прямого доступа к базам с этими данными. Для работы сервису необходимо иметь в своей внутренней базе имена и фамилии пользователей. Их можно получить из Identity текущего пользователя во время запроса. Требуется добавлять или обновлять имена во время каждого запроса. Желательно осуществлять это в отдельном потоке, чтобы эта работа не влияла на время выполнения основного запроса.
Читать дальше →
Всего голосов 20: ↑13 и ↓7+6
Комментарии13

Почему мы используем GraphQL в 8base

Время на прочтение4 мин
Количество просмотров6.7K


Друзья, всем привет!

Эта статья в первую очередь будет интересна фронтенд-разработчикам, особенно тем кому актуальна тема GraphQL, но в то же время я надеюсь, что она будет полезна и бэкенд-разработчикам и поможет им понять преимущества GraphQL глазами фронтендера.
Читать дальше →
Всего голосов 24: ↑19 и ↓5+14
Комментарии20

Мягкое удаление в REST API

Время на прочтение5 мин
Количество просмотров12K
image

Чтобы пользователь не чувствовал боли от безвозвратно утерянных данных, стоит задуматься о мягком удалении. При мягком удалении запись не удаляется из базы физически, а лишь помечается как удалённая. Это позволяет легко восстановить данные путём сброса флага.

Недавно я реализовал мягкое удаление в одном из наших REST-сервисов. Тех, кому интересно, что у меня получилось, приглашаю под кат.
Читать дальше →
Всего голосов 9: ↑0 и ↓9-9
Комментарии9

REST страсти по 200

Время на прочтение8 мин
Количество просмотров42K


Давно я хотел написать эту статью. Все думал — с какой стороны зайти правильнее? Но, вдруг, недавно, на Хабре появилась подобная статья, которая вызвала бурю в стакане. Больше всего меня удивил тот факт, что статью начали вбивать в минуса, хотя она даже не декларировала что-то, а скорее поднимала вопрос об использовании кодов ответа web-сервера в REST. Дебаты разгорелись жаркие. А апофеозом стало то, что статья ушла в черновики… килобайты комментариев, мнений и т.д. просто исчезли. Многие стали кармо-жертвами, считай, ни за что :)

В общем, именно судьба той статьи побудила меня написать эту. И я очень надеюсь, что она будет полезна и прояснит многое.

Предупреждаю, все ниже написанное является реальным опытом, а не когнитивной эквилибристикой. И так, погнали.
Читать дальше →
Всего голосов 79: ↑68 и ↓11+57
Комментарии115

Только без рук! Роботы, которые не повторяют действия пользователя

Время на прочтение7 мин
Количество просмотров4.3K
Эта обзорная статья о том, как использовать RPA для бизнес-процессов, которые включают в себя задачи, которые обычные люди выполнять не умеют, не хотят, или это занимает у них много времени и требует специальных знаний, такие как работу с FTP, базами данных или API.

Включение в процесс подобных действий приближает его создание к традиционному программированию и «скриптам», со всеми плюсами и минусами этого подхода.

Использование API даже в традиционных для роботизации задачах может значительно повысить скорость их выполнение, увеличить надежность и устойчивость, но при этому удаляет нас от реализации мечты о том, чтобы бизнес-пользователи сами создавали и поддерживали свои процессы, однозначно возвращает их разработку и поддержку в руки команды разработки.

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


Читать дальше →
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Принципы построения REST JSON API

Время на прочтение8 мин
Количество просмотров336K

Эта памятка писалась для внутренних нужд (открыть глаза менее опытным в вебе коллегам). Но, т.к. я насмотрелся велосипедов от довольно уважаемых, казалось бы, контор, — выкладываю на хабр. Мне кажется, многим будет полезно.


Зачем


Надеюсь, читающий уже понимает, зачем ему вообще нужен именно REST api, а не какой-нибудь монстр типа SOAP. Вопрос в том, зачем соблюдать какие-то стандарты и практики, если браузеры вроде бы позволяют делать что хочешь.


  • Стандарт HTTP это стандарт. Его несоблюдение вредно для кармы и ведёт к постоянным проблемам с безопасностью, кэшированием и прочими "закидонами" браузеров, которые совсем не закидоны, а просто следование стандарту.
  • Велосипеды со всякими {error: "message","result":...} невозможно нормально тестировать и отлаживать
  • Поддержка большим количеством готовых клиентских библиотек на все случаи жизни. Те, кто будет вашим api пользоваться, скажут большое человеческое спасибо.
  • Поддержка автоматизированного интеграционного тестирования. Когда сервер на любые запросы отдаёт 200 ОК — ну, это такое себе развлечение.
Читать дальше →
Всего голосов 71: ↑55 и ↓16+39
Комментарии207

Самодокументируемый REST сервер (Node.JS, TypeScript, Koa, Joi, Swagger)

Время на прочтение12 мин
Количество просмотров22K

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

Добро пожаловать под кат, где я опишу, как мы решали эту задачу в нашей команде.
Читать дальше →
Всего голосов 13: ↑11 и ↓2+9
Комментарии14

Писали API — порвали XML (два)

Время на прочтение7 мин
Количество просмотров4.7K
Первый API МоегоСклада появился 10 лет назад. Всё это время мы работаем над существующими версиями API и разрабатываем новые. А несколько версий API уже успели похоронить.

В этой статье будет много всего: как создавали API, зачем он нужен облачному сервису, что дает пользователям, на какие грабли мы успели наступить и что хотим делать дальше.
Читать дальше →
Всего голосов 8: ↑7 и ↓1+6
Комментарии3

Шпаргалки по безопасности: REST

Время на прочтение5 мин
Количество просмотров26K


REST — чрезвычайно популярная архитектура веб-приложений. Для вызова функций на сервере используются обычные HTTP-запросы с задаваемыми параметрами (для структуризации параметров обычно используют JSON или XML), при этом, строгого стандарта для REST-архитектуры не существует, что добавляет ей гибкости (и, конечно, немного хаоса).
Читать дальше →
Всего голосов 27: ↑23 и ↓4+19
Комментарии9

Architectural approaches to authorization in server applications: Activity-Based Access Control Framework

Время на прочтение10 мин
Количество просмотров1.4K

This article is about security. I’ll focus on this in the context of web applications, but I’ll also touch on other types of applications. Before I describe approaches and frameworks, I want to tell you a story.


Background


Throughout my years working in the IT sphere, I’ve had the opportunity to work on projects in a variety of fields. Even though the process of authenticating requirements remained relatively consistent, methods of implementing the authorization mechanism tended to be quite different from project to project. Authorization had to be written practically from scratch for the specific goals of each project; we had to develop an architectural solution, then modify it with changing requirements, test it, etc. All this was considered a common process that developers could not avoid. Every time someone implemented a new architectural approach, we felt more and more that we should come up with a general approach that would cover the main authorization tasks and (most importantly) could be reused on other applications. This article takes a look at a generalized architectural approach to authorization based on an example of a developed framework.


Approaches to Creating a Framework


As usual, before developing something new, we need to decide what problems we’re trying to solve, how the framework will help us solve them, and whether or not there is already a solution to these issues. I’ll walk you through each step, starting with identifying issues and describing our desired solution.


We’re focusing on two styles of coding: imperative and declarative. Imperative style is about how to get a result; declarative is about what you want to get as a result.

Read more →
Рейтинг0
Комментарии0

Код на React и TypeScript, который работает быстро. Доклад Яндекса

Время на прочтение16 мин
Количество просмотров27K
Евангелисты Svelte и других библиотек любят показывать примеры тормозящих компонентов на React. React и TypeScript дают много возможностей создавать медленный код. После доклада Виктора victor-homyakov вы сможете писать более производительные компоненты без усложнения кода.

— Здравствуйте, меня зовут Виктор, я один из разработчиков страницы поиска Яндекса. На ней каждый день сотни миллионов пользователей вводят свои запросы, получают страницу со ссылками или сразу с правильными ответами. Из-за такого количества запросов нам очень важно, чтобы наш код работал оптимально. И, конечно, я сразу должен затронуть тему преждевременной оптимизации кода.
Читать дальше →
Всего голосов 25: ↑24 и ↓1+23
Комментарии30

Тривиальная и неправильная «облачная» компиляция

Время на прочтение5 мин
Количество просмотров2.1K


Введение


Данная статья не история успеха, а скорее руководство «как не надо делать». Весной 2020 для поддержания спортивного тонуса участвовал в студенческом хакатоне (спойлер: заняли 2-е место). Удивительно, но задача из полуфинала оказалась более интересной и сложной чем финальная. Как вы поняли, о ней и своём решении расскажу под катом.

Под кат
Всего голосов 8: ↑6 и ↓2+4
Комментарии9

Aiohttp + Dependency Injector — руководство по применению dependency injection

Время на прочтение13 мин
Количество просмотров6.4K
Привет,

Я создатель Dependency Injector. Это dependency injection фреймворк для Python.

Продолжаю серию руководств по применению Dependency Injector для построения приложений.

В этом руководстве хочу показать как применять Dependency Injector для разработки aiohttp приложений.

Руководство состоит из таких частей:
Читать дальше →
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Black [O]lives Matter: раса, криминал и огонь на поражение в США. Часть 1

Время на прочтение9 мин
Количество просмотров16K

Действительно ли полицейские в США стреляют больше в чернокожих, чем в представителей других рас? Связано ли применение силы полицией с расой? Связана ли криминальность с расой? Какова вероятность быть застреленным полицейским в США, если ты белый и если ты чернокожий? Вооружимся открытыми данными, python, pandas и постараемся пролить чуть-чуть света, отставив в сторону пропаганду и политику.

Мне любопытно
Всего голосов 31: ↑20 и ↓11+9
Комментарии45

Black [O]lives Matter: раса, криминал и огонь на поражение в США. Часть 2

Время на прочтение15 мин
Количество просмотров32K

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

Поехали!
Всего голосов 108: ↑102 и ↓6+96
Комментарии386