- Таблица содержания
- Введение
- Цель
- Исходный репозиторий
- Функция main
- Добавление версионирования API и базовой аутентификации
- Передача параметров строки запроса
- REST API прослушивает порт
- Получить метод
- Полный исходный код
- Модульное тестирование Go REST API
- Выполнение модульного тестирования Go
- Сборка и запуск
- Тест в реальном времени
- Метод Localhost
- Метод Ngrok
- Заключение
- Следите за мной на,
Таблица содержания
- Введение
- Цель
- Источник Repo
- Основная функция
- Добавление версионности API и базовой аутентификации
- Передача параметров строки запроса
- REST API прослушивает порт
- Метод получения
- Полный исходный код
- Модульное тестирование Go REST API
- Выполнение модульного тестирования Go
- Сборка и запуск исходного кода Go
- Тестирование в реальном времени
- Метод Localhost
- Метод Ngrok
- Заключение
Введение
В предыдущем блоге мы узнали, как создать простой REST API.
В этом блоге мы рассмотрим следующие темы,
Как,
- Добавить версионность REST API
- Создать параметры строки запроса
- Добавить базовую аутентификацию в REST API
- Написать модульное тестирование Go для кода аутентификации API
- Тестировать REST API с аутентификацией в реальном времени
Цель
- Мы создадим REST API, который прослушивает
localhost
порт1357
и имеет версионность API с параметром строки запроса. - Пример формата URL, который мы планируем создать,
http://localhost:1357/api/v1/PersonId/Id432
.
Исходный репозиторий
Ознакомьтесь с полным исходным репозиторием здесь на GitHub
Давайте начнем разбивать код на блоки,
Функция main
Добавьте следующий код функции main()
.
Добавление версионирования API и базовой аутентификации
// Define gin router
router := gin.Default()
// Create Sub Router for customized API version and basic auth
subRouterAuthenticated := router.Group("/api/v1/PersonId", gin.BasicAuth(gin.Accounts{
"basic_auth_user": "userpass",
}))
Передача параметров строки запроса
subRouterAuthenticated.GET("/:IdValue", GetMethod)
REST API прослушивает порт
listenPort := "1357"
// Listen and Server on the LocalHost:Port
router.Run(":"+listenPort)
Получить метод
- Определите функцию
GetMethod
и добавьте следующий код - Она извлекает и печатает
Person IdValue
из параметра строки запроса, переданного в URL API
func GetMethod(c *gin.Context) {
fmt.Println("n'GetMethod' called")
IdValue := c.Params.ByName("IdValue")
message := "GetMethod Called With Param: " + IdValue
c.JSON(http.StatusOK, message)
// Print the Request Payload in console
ReqPayload := make([]byte, 1024)
ReqPayload, err := c.GetRawData()
if err != nil {
fmt.Println(err)
return
}
fmt.Println("Request Payload Data: ", string(ReqPayload))
}
Полный исходный код
// Golang REST API with API versioning and Basic Auth
package main
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
)
func GetMethod(c *gin.Context) {
fmt.Println("n'GetMethod' called")
IdValue := c.Params.ByName("IdValue")
message := "GetMethod Called With Param: " + IdValue
c.JSON(http.StatusOK, message)
ReqPayload := make([]byte, 1024)
ReqPayload, err := c.GetRawData()
if err != nil {
fmt.Println(err)
return
}
fmt.Println("Request Payload Data: ", string(ReqPayload))
}
func main() {
router := gin.Default()
// Create Sub Router for customised API version
subRouterAuthenticated := router.Group("/api/v1/PersonId", gin.BasicAuth(gin.Accounts{
"admin": "adminpass",
}))
subRouterAuthenticated.GET("/:IdValue", GetMethod)
listenPort := "1357"
// Listen and Server on the LocalHost:Port
router.Run(":"+listenPort)
}
Модульное тестирование Go REST API
-
Модуль Go
testing
может быть использован для создания кода модульного тестирования для источника Go. -
Код модульного тестирования Go выглядит следующим образом,
// Golang REST API unit testing program
package main
import (
"testing"
"net/http"
"net/http/httptest"
"fmt"
"bytes"
"github.com/gin-gonic/gin"
)
func TestGetMethod(t *testing.T) {
// Switch to test mode so you don't get such noisy output
gin.SetMode(gin.TestMode)
// Create the mock request you'd like to test. Make sure the second argument
// here is the same as one of the routes you defined in the router setup
// block!
body := bytes.NewBuffer([]byte("{"ApiTest":"GetReq"}"))
req, err := http.NewRequest("GET", "/api/v1/PersonId/Id456", body)
if err != nil {
t.Fatalf("Couldn't create request: %vn", err)
}
req.Header.Set("Content-Type", "application/json")
req.SetBasicAuth("admin", "adminpass")
// Setup your router, just like you did in your main function, and
// register your routes
router := gin.Default()
router.GET("/api/v1/PersonId/:IdValue", GetMethod)
// Create a response recorder so you can inspect the response
w := httptest.NewRecorder()
// Perform the request
router.ServeHTTP(w, req)
fmt.Println(w.Body)
}
- Обратитесь к моему предыдущему разделу блога
Write go test program
, чтобы узнать больше о написании кода go тестирования.
Выполнение модульного тестирования Go
Выполните команду go test
, и в консоли появится следующий результат,
'GetMethod' called
Request Payload Data: {"ApiTest":"GetReq"}
[GIN] 2020/08/03 - 12:26:29 | 200 | 7.2µs | | GET "/api/v1/PersonId/Id456"
"GetMethod Called With Param: Id456"
PASS
ok apiauth 0.008s
Это подтверждает, что созданный нами код REST API работает нормально.
Сборка и запуск
- Если мы хотим протестировать API на нашем сервере, на котором создан код, выполните следующую команду
go run apiauth.go
- Эта команда вызывает REST API на
localhost
порту1357
& консоль показывает следующий результат,
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /api/v1/PersonId/:IdValue --> main.GetMethod (4 handlers)
[GIN-debug] Listening and serving HTTP on :1357
- Затем переходим к тестированию REST API в реальном времени
Тест в реальном времени
Метод Localhost
Запустите curl
с базовой аутентификацией пользователь-пароль
curl -u admin:adminpass -i -X GET http://localhost:1357/api/v1/PersonId/Id456
- В результате в консоли будет показан результат, как показано ниже
"GetMethod Called With Param: Id456"
- В Ubuntu, зайдите на
localhost
URL в браузере и введите имя пользователя и пароль basic auth, когда появится запрос. - После ввода учетных данных браузер должен показать,
GetMethod Called With Param: Id456
.
Метод Ngrok
- Выполните команду
go run
для запуска API,go run apiauth.go
- Чтобы проверить наш REST API, нам нужно открыть локальный хост сервера для доступа в интернет.
- Поэтому мы можем использовать «ngrok» для этой цели.
- Скачайте ngrok здесь
- Распакуйте исполняемый файл ngrok в какое-либо место на вашем сервере.
- Запустите ngrok на порту 1357 (порт определен в коде go API), как показано ниже,
./ngrok http 1357
и выведите в консоль следующий результат
ngrok by @inconshreveable (Ctrl+C to quit)
Session Status online
Session Expires 7 hours, 12 minutes
Version 2.3.35
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding http://ca6d2c4cee3e.ngrok.io -> http://localhost:4000
Forwarding https://ca6d2c4cee3e.ngrok.io -> http://localhost:4000
-
ngrok генерирует динамический URL. Например:
http://ca6d2c4cee3e.ngrok.io
. -
REST API можно протестировать, добавив URL в адресную строку браузера,
-
Браузер предложит ввести данные для аутентификации. Введите учетные данные
-
После ввода учетных данных браузер должен показать,
Заключение
В этом блоге мы рассмотрели следующие темы,
- Добавление базовой аутентификации в REST API
- Юнит-тестирование кода аутентификации API
-
Тестирование REST API с базовой аутентификацией в реальном времени
-
Эта статья была ранее опубликована на моем личном профиле в сообществе dev, теперь я публикую ее повторно для более широкой аудитории.
-
Надеюсь, эта статья будет полезна тем, кто начинает знакомиться с концепциями kubernetes.
Следите за мной на,
- GitHub
- gsaravanan.dev