Здравствуйте, В этой статье я расскажу о том, как я настраивал свой сайт Cloud Resume Challenge на функциональность REST API.
В качестве небольшого предисловия, я всегда рассматривал REST API как шлюз для моих навыков работы с Powershell, чтобы иметь возможность выходить и взаимодействовать с Интернетом. Когда мне впервые представили Powershell, он был описан как инструмент для более быстрого и эффективного выполнения задач администрирования Windows. Он очень полезен для Windows server и, в частности, Server Core, но что хорошего в современном компьютере, если он не может подключиться к интернету?
Сначала это был веб-скрейпинг с помощью Invoke-Webrequest, но это не давало точной информации, которую я хотел. Было слишком много HTML после просмотра кодов состояния и необработанного содержимого. Появился Invoke-Restmethod. Это изменило ситуацию: я мог взаимодействовать с конечными точками HTTP привычным способом и передавать другие команды на основе информации от этих конечных точек.
Я прокрутил в голове несколько идей о том, какую информацию было бы уместно предоставлять в JSON. Для меня самым логичным было резюме.
Какие шаги мне для этого нужны?
-
Node js и Express js для размещения REST API
- Конечные точки
- JSON-файл для резюме
- Базовая аутентификация
-
Хост на Github для CI/CD
-
Хост на Azure, чтобы иметь публичную конечную точку
Node js и Express js для размещения REST API
Что мне нужно было сделать, чтобы настроить это?
Я использовал Javascript в основном конкурсе Cloud Resume Challenge, поэтому я начал с него, может быть, есть фреймворк, в который встроена функциональность REST API?
Я нашел его, Express js поверх Node js.
Конечные точки
Следуя нескольким руководствам, я смог запустить локальный экземпляр Node js, на который я мог сделать вызов invoke-Restmethod и получить информацию, которую я настроил для обслуживания.
app.get('/api', (req, res) => {
res.send('🔥🔥🔥');
})
JSON-файл для резюме
Что дальше? Ну, давайте найдем шаблон для моего резюме в JSON.
Я скопировал схему с сайта jsonresume.org и сделал некоторые изменения, чтобы они больше соответствовали моим навыкам.
Мне нужно было добавить этот JSON в качестве конечной точки. Вместо того чтобы помещать весь JSON в ответ, везде, где я искал, говорилось, что нужно иметь отдельный файл и чтобы основной файл ссылался на файл JSON.
Для этого нужно было добавить две вещи: fs и путь как const.
const fs = require("fs")
const resume = require("./resume.json")
app.get('/resume', (req, res) => {
res.header("Content-Type",'application/json');
res.sendFile('resume.json' , {root :__dirname});
});
В шаблоне JSON было место для размещения картинки. Я знал, что изображения не могут быть предоставлены в JSON, но я решил, что у меня может быть конечная точка, которая показывает изображение, если вы перейдете на нее в браузере.
Сначала я подумал о том, чтобы добавить изображение в репозиторий Github, но потом понял, что оно уже находится в хранилище Azure Blob. Что если у меня будет отдельная страница, которая будет ссылаться на это изображение?
После некоторых исследований я определил, что конечную точку можно просто связать с другой HTML-страницей. На этой HTML-странице мы можем отобразить связанное изображение.
app.get('/resume/image', (req, res) => {
res.sendFile(__dirname + '/image.html');
});
<img src="https://azureresumekm.blob.core.windows.net/$web/images/km.jfif" alt="My_Picture"></img>
Вот я и доступен в конечной точке /resume/image.
Базовая аутентификация
Последний кусочек головоломки, чтобы сделать это уникальным, – аутентификация.
Ранее я мог разместить у себя REST API, но мне не нравилось, что можно было просто зайти на сайт и посмотреть информацию. Я хотел, чтобы для доступа к информации нужно было пройти через определенный барьер. Я понимаю, что базовая аутентификация используется не так часто, и ставить ее прямо в код, который размещается на Github, небезопасно, но это только для демонстрации.
Тем не менее, я настроил пару учетных записей базовой аутентификации в индексном файле, которые будут выдавать ответ 401, если учетные данные введены неправильно. Я также добавил вызов, так что если сайт посещает браузер и не вводит учетные данные, он будет запрашивать их.
app.use(basicAuth({
users: {'user': "resume" },
challenge: true
}))
Итак, у меня готовы все файлы, я запускаю node .
на своем экземпляре VSCode и пробую конечные точки. Успех, по крайней мере, на localhost. Я также пробую получить доступ через Powershell, но натыкаюсь на препятствие. Invoke-restmethod не работает с базовой аутентификацией. Я провел небольшое исследование и нашел официальную документацию по этой команде, в которой есть параметр -authentication. В моей версии Powershell его не было, поэтому я решил обновить оболочку.
Сразу после обновления мы смогли использовать параметры -cred, -authentication и -allowunencryptedauthentication для инициирования вызова.
Invoke-RestMethod http://localhost:8080/resume -cred resume
-authentication Basic -AllowUnencryptedAuthentication
Размещение на Github для CI/CD
Из того, что я мог вспомнить из оригинального CRC и веб-сайта, создание репозитория Github для этого не должно было стать проблемой.
Оглядываясь назад, я не уверен, что что-то после init было необходимо, но я был потерян в VSCode, и выполнение всех команд не повредило.
Далее я использовал учебник Github, в котором были соответствующие команды az cli для начала работы и правильный YAML-файл для создания соединения.
У меня возникли небольшие проблемы с первым запуском действий Github, тест npm был неудачным, и я не был уверен, почему. Я проверил, и в моем файле package.json был буквально встроен код ошибки.
“test”: “echo “Error: no test specified” && exit 1″.
Я не уверен в цели этого, но полное удаление атрибута test, похоже, сработало.
Я столкнулся с другой проблемой, я скопировал секретный ключ, как предлагалось в руководстве, но я заметил, что я скопировал имя, которое не соответствовало YAML файлу. Я исправил это и смог установить соединение с Github Actions.
Хостинг на Azure
По учебнику Github я использовал az cli для создания нового плана обслуживания приложений и веб-приложения для размещения приложения node. Затем я хотел добавить пользовательский домен. В прошлом, когда я пытался разместить конечную точку на своем сайте, у меня возникали проблемы со статическим веб-приложением. Конкретное ограничение, с которым я столкнулся, заключалось в том, что была доступна только страница “index”, я не мог найти способ добавить /resume в это веб-приложение. Вместо того, чтобы отказаться от статического веб-приложения, я решил создать поддомен.
rest.kmcloud.tech
Это то, что я, вероятно, изменю в будущем. Когда я изучаю лучшие практики для REST API, я вижу, что более разумно располагать конечные точки в корне веб-страницы.
Заключение
Наконец, все части работают вместе, чтобы предоставить мое резюме в JSON любому человеку в интернете.
curl rest.kmcloud.tech/resume -u user:resume
Invoke-RestMethod http://rest.kmcloud.tech/resume -cred user
-authentication Basic -AllowUnencryptedAuthentication
С помощью действий Github я также могу вносить изменения локально, быстро тестировать их и отправлять в Azure. Нет необходимости возиться с файлами или настройками, все просто работает.
Репозиторий Github для этого проекта находится здесь.
https://github.com/Kenseventy/Resume-API
В будущем я надеюсь реализовать “счетчик”, как на сайте, а также “гостевую книгу”, которая будет хранить фактические ответы в базе данных.
Спасибо, что заглянули в этот блог, я знаю, что он длинный и, возможно, содержит неверную информацию, но я рассматриваю этот блог как место, где я могу записывать свои мысли и фиксировать некоторые результаты своей работы.
Если это поможет хотя бы одному человеку, будет здорово.
Спасибо,
-Кентон