Посмотрите на внутренний интерфейс API, написанный другими, он называется элегантным!

Spring Boot

Нет публики:MarkerHub,Веб-сайт:markerhub.com

Автор: Лев II

Источник: r6d.cn/tEvn

В современном мобильном интернете преобладают распределенные и микросервисы, большинство проектов теперь используют микросервисный фреймворк, а фронтенд и бэкэнд разделены Большой фронтенд, стек технологий и экосистема все очень зрело; в прошлом бэкэнд-персонал смотрел свысока на фронтенд-персонал, но теперь бэкэнд-персонал должен заново понять фронтенд, а фронтенд уже очень систематичен).

Общая архитектура общей системы выглядит следующим образом:

Следует отметить, что некоторые мелкие партнеры ответят, что эта архитектура слишком проста, слишком низка, никаких шлюзов, кеша, промежуточного программного обеспечения сообщений, ничего из этого. Поскольку Lao Gu в основном представляет интерфейс API, мы сосредоточимся на этом, а другие партнеры по модулям сами дополнят его.

взаимодействие интерфейса

Фронтенд взаимодействует с бэкендом. Фронтенд запрашивает URL-путь в соответствии с соглашением и передает соответствующие параметры. Бэкенд-сервер получает запрос, выполняет бизнес-обработку и возвращает данные на фронтенд .

Для спокойного стиля URL-пути и требований заголовка публичного запроса входящих параметров (таких как: app_version, api_version, device и т. д.) я не буду здесь его представлять, друзья сами разберутся, а это относительно прост.

Сосредоточиться на том, как внутренний сервер реализует возврат данных во внешний интерфейс?

формат возврата

Когда серверная часть возвращается во внешний интерфейс, мы обычно используем тело JSON, которое определяется следующим образом:

{  
 #返回状态码  
 code:integer,    
 #返回信息描述  
 message:string,  
 #返回值  
 data:object  
}


КОД код состояния

code возвращает код состояния.Как правило, друзья добавляют все, что им нужно во время разработки.

Если интерфейс хочет вернуть исключение разрешения пользователя, добавим код состояния 101. В следующий раз, когда мы захотим добавить исключение параметра данных, добавим код состояния 102. Таким образом, хотя бизнес может быть удовлетворен как обычно, код состояния слишком запутан.

Мы должны иметь возможность ссылаться на код состояния, возвращаемый HTTP-запросом.

:下面是常见的HTTP状态码:  
200 - 请求成功  
301 - 资源(网页等)被永久转移到其它URL  
404 - 请求的资源(网页等)不存在  
500 - 内部服务器错误


Мы можем обратиться к такому дизайну, это преимущество классифицирует тип ошибки в определенный интервал, если интервала недостаточно, он может быть оформлен в 4 цифры.

#1000~1999 区间表示参数错误  
#2000~2999 区间表示用户错误  
#3000~3999 区间表示接口异常  
 


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

Message

Это поле относительно просто для понимания, то есть, как дружелюбно подсказать при возникновении ошибки. Общий дизайн заключается в разработке вместе с кодом состояния кода, например

Затем определите в перечислении код состояния

Код состояния и информация будут соответствовать друг другу, что упрощает обслуживание.

Data

Тело возвращаемых данных, формат JSON и различные тела JSON в зависимости от бизнеса.

Мы должны разработать класс возвращаемого тела Result

Контроллер уровня управления

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

Мы видим, что после получения объекта заказа мы используем конструктор Result для переноса присваивания, а затем возвращаем его. Вы, ребята, выяснили, что упаковка метода строительства очень хлопотна?Мы можем оптимизировать его.

Эстетически оптимизированный

Мы можем добавить статические методы в класс Result и сразу понять

Затем давайте преобразуем контроллер

Код проще и красивее?

элегантная оптимизация

Выше мы видели, что в класс Result добавлен статический метод, который делает код бизнес-обработки лаконичным. Но вы, ребята, нашли несколько проблем с этим:

1. Возврат каждого метода — это инкапсулированный объект Result, который не имеет бизнес-значения.
2. В бизнес-коде мы вызываем Result.success в случае успеха и вызываем Result.failure в случае аномальных ошибок. это слишком
3. Вышеприведенный код оценивает, является ли идентификатор нулевым.На самом деле, мы можем использовать hibernate validate для проверки, и нет необходимости судить в теле метода.

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

Это то же самое, что и наш обычный код. Он очень интуитивно понятен и напрямую возвращает объект заказа. Разве это не идеально?

Каков план реализации?

План реализации

Ребята, у вас есть идеи, как этого добиться? В этом процессе нам нужно сделать несколько вещей.

1. Определите аннотацию @ResponseResult, указывающую, что значение, возвращаемое этим интерфейсом, необходимо обернуть
2. Перехватите запрос, чтобы определить, нужно ли аннотировать запрос с помощью @ResponseResult.
3. Основным шагом является реализация интерфейсов ResponseBodyAdvice и @ControllerAdvice, чтобы определить, нужно ли обернуть возвращаемое значение, и, если необходимо, переписать возвращаемое значение интерфейса Controller.

Класс аннотаций

Используется для обозначения возвращаемого значения метода, нужно ли его обернуть

перехватчик

Перехватываем запрос, нужно ли заворачивать возвращаемое этим запросом значение, собственно, при запуске парсинг аннотации @ResponseResult

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

Переопределить тело возврата

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

Как сделать глобальную обработку исключений, причина для пробела, Лао Гу не будет вводить его здесь, пока мышление ясно, его можно изменить самостоятельно.

Переопределить контроллер

Добавьте аннотацию @ResponseResult в класс контроллера или тело метода, так что все в порядке, просто. Идея дизайна, возвращенная здесь, завершена, она проста и элегантна?

Суммировать

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

Рекомендуемое чтение

Удивительно, на этом веб-сайте Java есть все виды проектов! https://markerhub.com

Мастер UP этой станции B, java действительно хорош!

классно! Последнюю версию идей программирования на Java можно прочитать онлайн!