Тратьте свое время на действительно важные дела. Например, пишет ваш документ API. Пусть клиент API будет создан с душевным спокойствием.
Жизнь перед смертью.
Сила перед слабостью.
Путешествие перед целью. - Брэндон Сандерсон
Мне нравится Архив штормового света. Хотя я надеюсь, что мистер Сандерсон доделает его поскорее. Но я думаю, ожидание - тоже часть удовольствия. Тем не менее, эта цитата имеет некоторое сходство с тем, о чем я собираюсь говорить, с небольшими изменениями.
API перед фронтенд-разработкой.
Я был там, когда фронтенду приходилось работать с API без какой-либо документации. Вам придется кодировать (или тратить свое время) на интерфейс запроса и ответа. И вызовите конечную точку API с помощью jQuery или $ q. У вас может возникнуть соблазн пропустить объявление объекта передачи, но вы пожалеете об этом, когда кто-то из вашей серверной команды изменит определения API.
С помощью чванства дела обстоят намного проще.
Все конечные точки будут сгенерированы как службы, и все они возвращают Observable с соответствующим типом!
1. Создайте угловую библиотеку
Я пробовал использовать небиблиотечный подход, чтобы сгенерировать клиент API в основной папке src. Я должен сказать, это довольно грязно. Поскольку сгенерированные коды смешиваются с другими, вы должны будете игнорировать их по каталогу с помощью git. Что еще хуже, вам придется заниматься удалением. По мере развития API вы будете отказываться от моделей и переименовывать API чаще, чем вы думаете. Повторное создание нового API может заменить API с тем же именем, но не удалит автоматически API с разными именами.
Используйте подход с использованием библиотеки angular, это так же просто, как удалить папку библиотеки src прямо перед запуском swagger codegen, чтобы получить чистую сборку.
ng generate library foo-swagger-client
2. Приведите в порядок библиотеку angular.
Angular CLI сгенерирует за вас проект библиотеки. Вы должны найти его в каталоге projects / foo-swagger-client. Он также генерирует компонент и службу, которые мало полезны в нашем сценарии. Давайте удалим всю папку src. В нашем случае projects/foo-swagger-client/src
.
3. Создайте клиент API.
Предположим, вы подготовили документ со спецификацией API. Сейчас мы воспользуемся swagger-codegen для создания клиента API. Если вы используете Angular 7, прочтите другую мою статью, чтобы узнать, как это сделать.
Здесь я буду использовать swagger-codegen 2.4.0 через докер.
rm -rf projects/foo-swagger-client/src
mkdir -p tmp
SPECFILE=tmp/spec.json
wget --quiet --no-check-certificate $SPECURL -O $SPECFILE
docker run --rm --net=host -u="$(id -u)" -v ${PWD}:/local swaggerapi/swagger-codegen-cli:2.4.0 generate \
-i /local/$SPECFILE \
-l typescript-angular \
-o /local/projects/foo-swagger-client/src \
--additional-properties ngVersion=7.2.0
Команды используют wget для загрузки файла спецификации из $ SPECURL. Это должно указывать на ваш файл спецификации. Я использую wget, чтобы обойти проблему с самозаверяющим сертификатом, чтобы сценарий работал во всех средах.
Теперь давайте взглянем на вашу библиотеку foo-swagger-client.
api содержит все службы, которыми вы будете пользоваться. Все конечные точки были сгенерированы как служба, вводимая зависимостями, и все они возвращают Observable с соответствующим типом!
4. Обновите entryFile.
Проект библиотеки Angular почти завершен, осталось сделать еще один шаг. Нам нужно указать Angular точку входа в эту библиотеку. Swagger сгенерировал для нас входной файл index.ts
, нам просто нужно сообщить об этом Angular. Измените его в файле projects/foo-swagger-client/ng-package.json
.
Теперь мы можем построить проект библиотеки.
ng build foo-swagger-client
5. Используйте клиент API.
Сначала добавьте его в свой AppModule.
import {ApiModule} from 'foo-swagger-client'; @NgModule({ declarations: [ AppComponent ], imports: [ ... ApiModule.forRoot(IdentityService.getApiConfiguration), ... }) export class AppModule { }
IdentityService.getApiConfiguration () - статический метод, с помощью которого вы можете предоставить конфигурацию API. Обычно в этом методе требуется заполнить токен аутентификации.
Обратите внимание, что для импорта используется «foo-swagger-client», а не относительный путь. Библиотека предоставляется как модуль npm. Это особенно верно в режиме разработки, где ng serve
автоматически выбирает библиотеку. Это достигается за счет конфигурации путей в tsconfig.json
в корневой папке проекта. Обратите внимание: трюк с путями работает только для компилятора машинописного текста. Когда я попытался использовать его в своем проекте Angular Universal, сборка просто не удалась, и мне пришлось использовать npm link
, чтобы исправить это.
Я не пробовал, но думаю, что импорт по относительному пути тоже должен работать. Однако использование имени модуля библиотеки даст вам больше гибкости в будущем. Возможно, вы когда-нибудь захотите опубликовать свою библиотеку на npm.
Заключение
Я рекомендую всем попробовать чванство, это определенно стоит потраченного времени.
Проверка типов - это благо Angular (на самом деле Typescript). Не бойтесь улучшать свой API. Просто используйте 10 секунд, чтобы повторно сгенерировать клиент API, и увидите, как компилятор жалуется. Скоро вы узнаете, где провести рефакторинг своих кодов!
Я напишу еще одну статью о том, как создать спецификацию из приложения игрового фреймворка. Это не связано с Angular, но вернитесь позже, если вам интересно.
Подробнее о #Swagger
Вы узнали что-то новое? Если да, пожалуйста:
↓ кнопка хлопка 👏 внизу, чтобы это увидело больше людей