Kenton’s API v1

Здравствуйте, В этой статье я расскажу о том, как я настраивал свой сайт Cloud Resume Challenge на функциональность REST API.

В качестве небольшого предисловия, я всегда рассматривал REST API как шлюз для моих навыков работы с Powershell, чтобы иметь возможность выходить и взаимодействовать с Интернетом. Когда мне впервые представили Powershell, он был описан как инструмент для более быстрого и эффективного выполнения задач администрирования Windows. Он очень полезен для Windows server и, в частности, Server Core, но что хорошего в современном компьютере, если он не может подключиться к интернету?

Сначала это был веб-скрейпинг с помощью Invoke-Webrequest, но это не давало точной информации, которую я хотел. Было слишком много HTML после просмотра кодов состояния и необработанного содержимого. Появился Invoke-Restmethod. Это изменило ситуацию: я мог взаимодействовать с конечными точками HTTP привычным способом и передавать другие команды на основе информации от этих конечных точек.

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

Какие шаги мне для этого нужны?

  1. Node js и Express js для размещения REST API

    • Конечные точки
    • JSON-файл для резюме
    • Базовая аутентификация
  2. Хост на Github для CI/CD

  3. Хост на 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

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

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

Если это поможет хотя бы одному человеку, будет здорово.

Спасибо,
-Кентон

Оцените статью
Procodings.ru
Добавить комментарий