Разработка REST API с помощью Go с версионированием API, базовой авторизацией и строкой запроса


Таблица содержания

  • Введение
  • Цель
  • Источник 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
  • LinkedIn
  • Twitter
  • gsaravanan.dev

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