Практика RESTful, общий интерфейс, разделение внешнего и внутреннего интерфейса и соглашение об интерфейсе.

RESTful

предисловие

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

Наша цель

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

  • Тратьте минимум времени на написание документации и убедитесь, что 90% разработчиков все понимают.

  • Даже если вы не читаете документацию, вы можете знать все виды логики интерфейса.

  • Не переписывайте код

  • Пишите максимально читаемый код

что мы наделали

  • Полное разделение спереди и задних концов

  • Android, ios, веб используют набор интерфейсов

  • Унифицированная спецификация интерфейса (опубликовать, поставить, получить, исправить, удалить)

  • Унифицированные инструменты отладки

  • Документация по единому интерфейсу

перед нами

Интерфейс выглядит так:


Запрос клиента такой:

  • …/Aproject/module1/getProducts?id=1&a=2&b=3&c=4&d=5…………

  • Страница A ====="Страница B (содержащая n переменных) ===="Страница C (содержащая m переменных, включая i переменных страницы A) ------- часто n>4

  • Большая часть запросов POST.Что за хрень ставить,патчить,удалять - это не мое дело.

  • Что касается использования json для входных параметров интерфейса, то это полностью зависит от настроения разработчиков.

Вывод такой:

{"сообщение":"успех","код":0,"данные":конкретный контент}

Массив, содержащийся в данных, может быть [{"a":"1","b":"1"},{"a":"1","b":"1"},{"a":" 1","b":"1"},{"a":"1","b":"1"}] не будет использовать идентификатор, даже если он используется на следующей странице, но пропустит все поля в . В интерфейсе A используйте product, чтобы вернуть продукт; в интерфейсе B используйте good, и несколько интерфейсов, вероятно, будут несогласованными.

Стыковка клиента похож на это:

  • Один набор для Android и ios, один набор для некоторых интерфейсов, один набор для HTML5.

  • Клиент и фон постоянно общаются

Документация по интерфейсу такая

  • swagger

  • рэп Али

  • Документ Word

  • разное

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

Задняя часть вот такая

.../Проект/модуль1/getProducts ---- интерфейс
.../Проект/Module1/Products.html ---- страница
.../Проект/модуль1/Products.js ---- статические ресурсы

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

и т.д…………

рефакторинг

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

соглашения о базе данных

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

соглашение о выводе API

Условлено, что все исходящие параметры содержат список, и другие запросы будут использовать эту группу списков, тогда все объекты в списке должны содержать уникальный идентификатор.

соглашение о входе

Согласовано, что аутентификация идентификатора токена единообразно проходит в режиме параметров, а серверная часть использует программирование аспекта aop для идентификации идентификатора пользователя. Остальные параметры всегда json.

результирующее соглашение об интерфейсе

  • GET: соответствует операции извлечения (операции запроса)
  • POST: соответствует операции Create
  • УДАЛИТЬ: соответствует операции Удалить
  • Поместите: Операция обновления, соответствующая
  • ИСПРАВЛЕНИЕ: Соответствующее действие обновления

Сначала мы выбираем существительное во множественном числе, например продукт

почтовый метод

Добавить ХХХ
Например.../продукты
Это означает, что входной параметр нового продукта json выглядит следующим образом:

{
    "name":"我是一款新产品",
    "price":100,
    "kind":"我的分类",
    "pic":[一组图片],
     //等等还有很多

}

Уровень управления кодом Java

    @ResponseBody
    @RequestMapping(value = "/A项目/B模块/products", method = {RequestMethod.POST})
    public ResultObject getProducts() {
        //具体逻辑。
    }

метод PUT

Обновить запись XXX
Например.../продукты/1111111111
Входной json выглядит следующим образом:

{
    "name":"我是一款新产品",
    "price":100,
    "kind":"我的分类",
    "pic":[一组图片],
     //等等还有很多

}

Указывает на обновление записи с 1111111111id

уровень управления кодом Java

    @ResponseBody
    @RequestMapping(value = "/A项目/B模块/products/{id}", method = {RequestMethod.PUT})
    public ResultObject putProducts(@PathVariable(value = "id") String id) {
        //具体逻辑。
    }

получить метод

Получить все ХХХ
.../products означает получить все продукты
Из-за подкачки мы добавили ?page=1&pageSize=50

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

Например

{
    "data":{"list":[{"id":"唯一id","其他很多字段":""},{"id":"唯一id","其他很多字段":""}],"page":1,其他字段},
    "code":0,
    "message":"成功"
}

.../products/{id} для получения определенного продукта (должен быть более подробным, чем список)

Например, в конкретном продукте также содержится список, например, рекомендуемый список продуктов, то: ...... / Products / {Id} / Рекомендации

Предположим, что он содержит не список, а объект, например информацию о комиссии товара, тогда: .../products/{id}/Commission

Здесь мы судим, является ли это объектом или списком, по тому, стоит ли существительное во множественном числе.

уровень управления кодом Java

    @ResponseBody
    @RequestMapping(value = "/A项目/B模块/products/{id}", method = {RequestMethod.GET})
    public ResultObject putProducts(@PathVariable(value = "id") String id) {
        //具体逻辑。
    }

патч метод

Обновить информацию о локальном продукте XXX YYY

Входные параметры являются подмножеством входных параметров метода post. Будут объяснены все параметры, которые поддерживают обновление, но не все переменные поддерживаются.

.../продукты/{id}

{
    "name":"我是一款新产品",
    "price":100,
      //部分变量
}

уровень управления кодом Java

    @ResponseBody
    @RequestMapping(value = "/A项目/B模块/products/{id}", method = {RequestMethod.PATCH})
    public ResultObject putProducts(@PathVariable(value = "id") String id) {
        //具体逻辑。
    }

метод удаления

Удалить записи XXX
 …/продукты/11111

Удалить 11111 товаров.

уровень управления кодом Java

    @ResponseBody
    @RequestMapping(value = "/A项目/B模块/products/{id}", method = {RequestMethod.DELETE})
    public ResultObject putProducts(@PathVariable(value = "id") String id) {
        //具体逻辑。
    }

другие инструкции

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

Разрешительное соглашение

Сервер - определить роль пользователя, есть ли разрешение на выполнение логики.

Соглашение о разделении внешнего и внутреннего интерфейса

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

Общий интерфейс

Веб, Android и ios используют унифицированный интерфейс не из-за особых требований какой стороны требуются дополнительные открытые интерфейсы.

Используйте унифицированный инструмент создания слоев dao

На основе mybatis-generator он трансформируется в слой dao и некоторые сервисные слои, подходящие для нашего проекта, которые совместно поддерживаются и используются внутри.

Используйте почтальон как самый интерфейсный документ и инструмент отладки

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

Мы рекомендуем использовать плагин для браузера, в качестве примера мы возьмем 360 Speed ​​​​​​Browser. Адрес загрузки плагина:

https://download.csdn.net/download/qq273681448/10033456

Откройте центр расширений браузера 360, затем проверьте режим разработчика, затем нажмите, чтобы загрузить распакованное расширение, выберите распакованный каталог сжатого пакета и, наконец, нажмите, чтобы запустить.

Среди них в тестах пишутся комментарии к параметрам и описания интерфейсов:

/*
这里是接口说明,和每个出参、入参的意思。
*/

Интерфейсы разбиты на папки по модулям:

Входные параметры:

Пример вывода:

Обычный запрос:

Разработчики могут непосредственно видеть пример интерфейса для разработки, а при разработке разработчики могут сохранить его как файл postman, вызвав его один раз.Чтобы ускорить запуск, мы разрешаем код (включая комментарии), определяемый переменными класса сущности в java, который нужно скопировать напрямую. Вставьте его.

js и другие проблемы с кешированием статических ресурсов

В краткосрочной перспективе мое требование состоит в том, чтобы уменьшить количество изменений в js-файлах, а если есть изменения, обязательно изменить номер версии. Итак, как уменьшить модификацию, наш подход заключается в том, чтобы написать часть js в html. В любом случае, передняя и задняя части разделены, и большое дело в том, чтобы обновить кеш узла cdn. В конце концов, большинство браузеров не будут активно кешировать html-файлы (большинство браузеров кэшируют документы js и т. д.).

Единая структура запросов js

Здесь мы используем структуру запроса angular js, потому что мы используем больше angularjs внутри и лучше знакомы с ним Инкапсулированный запрос может автоматически выводить запрос об ошибке и переписывать обратный вызов ошибки.

Текущий эффект

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

.../классы

Видно, что это интерфейс для получения списка классов,

предполагать
……/classes/id get Получить сведения о классе, чей идентификатор равен id
....../classes/id patch изменяет информацию о классе
……/classes/id удалить удалить информацию о классе

Что касается входных параметров, patch является подмножеством post, put=patch, delete не имеет входных параметров.

Что касается значения входных параметров, вы можете напрямую открыть почтальон, чтобы напрямую просмотреть значение каждого поля, и вы можете вызывать данные среды разработки (компьютеры, не являющиеся разработчиками) в режиме реального времени.Здесь мы используем несколько сред.Для получения подробной информации вы можете учиться:

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

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

На данный момент наши расходы на связь снизились более чем вдвое, а оставшееся содержание встречи — декомпозиция требований в соответствии с пользовательским интерфейсом или построение в соответствии с пользовательским интерфейсом.

Суммировать

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