"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > GopherLight를 사용하여 Go에서 전문가처럼 API를 작성하는 방법

GopherLight를 사용하여 Go에서 전문가처럼 API를 작성하는 방법

2024년 11월 18일에 게시됨
검색:860

How to Write APIs Like a Pro in Go with GopherLight

문서

고퍼라이트

안녕하세요 여러분, 먼저 저희 프로젝트를 선택해 주셔서 감사하다는 말씀을 전하고 싶습니다. 비록 그는 작지만 우리는 큰 열정으로 해냈습니다! 사용을 시작하려면 먼저 설치해야 합니다. 이미 설치했다고 가정해 보겠습니다. 그런 다음 req 및 router
인 프레임워크의 기본 모듈을 설치합니다.

go get github.com/BrunoCiccarino/GopherLight/router
go get github.com/BrunoCiccarino/GopherLight/req

이미 다운로드하셨나요? 휴! 이제 첫 번째 Hello World를 만들 수 있습니다.

package main

import (
    "fmt"
    "github.com/BrunoCiccarino/GopherLight/router"
    "github.com/BrunoCiccarino/GopherLight/req"
)


func main() {
    app := router.NewApp()

    // Define a route that responds to a GET request at "/hello".
    app.Get("/hello", func(r *req.Request, w *req.Response) {
        w.Send("Hello, World!")
    })

    fmt.Println("Server listening on port 3333")
    app.Listen(":3333")
}

아주 간단하죠? 그리고 GopherLight로 할 수 있는 일이 훨씬 더 많습니다. HTTP 메소드와 요청 및 응답 도구에 대한 전체 분석을 계속 읽어보세요.

지원되는 HTTP 메서드
다음은 router.App과 함께 사용할 수 있는 HTTP 메소드 목록입니다. 이들 각각을 사용하면 다양한 유형의 요청을 처리하기 위한 경로를 설정할 수 있습니다. 뛰어들어 보세요!

얻다

  • 사용법: app.Get(경로, 핸들러)

아무 것도 수정하지 않고 데이터를 검색합니다.
예: 항목 목록 가져오기 또는 사용자 세부정보 읽기

우편

  • 사용법: app.Post(경로, 핸들러)

새 리소스를 생성하기 위해 데이터를 보냅니다.
예: 양식 제출 또는 목록에 새 항목 추가.

놓다

사용법: app.Put(경로, 핸들러)

리소스를 업데이트하거나 교체합니다. "덮어쓰기" 작업입니다.
예: 전체 사용자 프로필 업데이트.

삭제

사용법: app.Delete(경로, 핸들러)

리소스를 삭제합니다.
예: 사용자 제거 또는 게시물 삭제.

반점

사용법: app.Patch(경로, 핸들러)

모든 것을 교체하지 않고 리소스를 부분적으로 업데이트합니다.
예: 사용자 프로필의 이메일만 업데이트합니다.

옵션

사용법: app.Options(경로, 핸들러)

주로 CORS 실행 전 요청에 대해 URL에 허용된 HTTP 메소드를 반환합니다.

머리

사용법: app.Head(경로, 핸들러)

GET과 비슷하지만 응답 본문이 없습니다. 리소스가 존재하는지 확인하는 데 사용합니다.

연결 및 추적

사용법: app.Connect(경로, 핸들러), app.Trace(경로, 핸들러)

고급 방법: CONNECT는 터널(SSL용)을 설정하고 TRACE는 디버깅을 위한 것이며 요청을 다시 반영합니다.

req.Request 및 req.Response 작업

이제 경로를 살펴보았으므로 들어오는 요청을 처리하고 응답을 보내는 데 도움이 되는 도우미인 요청 및 응답 개체에 대해 이야기해 보겠습니다.

요구

각 요청 핸들러는 들어오는 요청에 대한 정보가 로드된 요청 개체를 가져옵니다. 이를 통해 수행할 수 있는 작업은 다음과 같습니다.

  • 쿼리 매개변수: .QueryParam("key")를 사용하여 쿼리 매개변수를 가져옵니다.
  • 헤더: .Header("key")를 사용하여 헤더에 액세스합니다.
  • Body as String: .BodyAsString()을 사용하여 요청 본문을 가져옵니다.

예:

app.Get("/greet", func(r *req.Request, w *req.Response) {
    name := r.QueryParam("name")
    if name == "" {
        name = "stranger"
    }
    w.Send("Hello, "   name   "!")
})

응답

응답 개체는 클라이언트에 응답을 다시 보내는 데 도움이 됩니다. 수행할 수 있는 작업은 다음과 같습니다.

  • 텍스트 보내기: .Send(데이터 문자열)는 일반 텍스트를 다시 씁니다.
  • 상태 설정: .Status(code)는 HTTP 상태를 설정합니다.
  • JSON 보내기: .JSON(data)는 Go 객체를 JSON으로 직렬화하여 보냅니다.
  • 오류 처리: .JSONError(message)는 JSON 형식의 오류 응답을 보냅니다.

예:

app.Get("/user", func(r *req.Request, w *req.Response) {
    user := map[string]string{"name": "Gopher", "language": "Go"}
    w.JSON(user)
})

미들웨어

Go 웹 앱에 몇 가지 중요한 기능을 추가할 수 있는 일련의 미들웨어가 준비되어 있습니다. 이러한 각 미들웨어는 보안, 로깅, 시간 초과 등 고유한 마법을 제공합니다! 하나씩 분석해 보겠습니다. ?

인증 미들웨어(JWT)

저희 AuthMiddleware는 JWT(JSON 웹 토큰)로 경로를 보호하는 데 도움이 됩니다. 유연성이 뛰어나 비밀 키, 오류 처리, 토큰 추출 방법을 맞춤 설정할 수 있습니다.

설정
시작하려면 JWTConfig:

를 사용하여 JWT 설정을 구성하세요.
  • SecretKey: JWT 서명을 위한 비밀 키입니다.
  • SigningMethod: JWT 서명 알고리즘입니다.
  • ErrorHandler: 인증 오류 처리를 위한 사용자 정의 오류 처리기(선택 사항).
  • TokenExtractor: 요청 헤더에서 토큰을 추출합니다(선택 사항).

import (
    "github.com/BrunoCiccarino/GopherLight/middleware"
)

config := middleware.JWTConfig{
    SecretKey: []byte("your_secret_key"),
}
app.Use(middleware.NewAuthMiddleware(config))

CORS 미들웨어

교차 출처 요청을 허용해야 합니까? 괜찮아요! CORSMiddleware는 다른 도메인에서 API에 액세스할 수 있도록 CORS(Cross-Origin Resource Sharing) 설정을 구성합니다.

구성 옵션

  • AllowOrigin: 모든 원본을 허용하거나 도메인(예: "http://example.com")을 지정하려면 "*"로 설정합니다.
  • AllowMethods: 어떤 HTTP 메소드가 허용됩니까? 일반적인 선택에는 "GET", "POST" 등이 있습니다.
  • AllowHeaders: 클라이언트가 사용할 수 있는 헤더를 지정합니다.
  • AllowCredentials: 쿠키 또는 HTTP 인증을 포함하려면 true로 설정하세요.
  • ExposeHeaders: 클라이언트가 응답에서 특정 헤더를 읽도록 합니다.
  • MaxAge: 실행 전 요청에 대한 캐시 시간(초)입니다.

corsOptions := middleware.CORSOptions{
    AllowOrigin: "*",
    AllowMethods: []string{"GET", "POST"},
}
app.Use(middleware.CORSMiddleware(corsOptions))

CSRF 미들웨어

저희 CSRF미들웨어는 각 요청과 함께 전송된 CSRF 토큰을 검증하여 교차 사이트 요청 위조로부터 보호합니다. 생성CSRFToken()을 사용하여 보안 토큰을 생성한 다음 자체 isValidToken 함수로 유효성을 검사합니다.

app.Use(middleware.CSRFMiddleware(func(token string) bool {
    return token == "your_valid_token"
}))

그리고 다음을 사용하여 토큰을 생성하는 것을 잊지 마세요:

csrfToken := middleware.GenerateCSRFToken()

로깅 미들웨어

서버에서 무슨 일이 일어나고 있는지 추적하고 싶으십니까? LoggingMiddleware는 메서드, 경로, 소요 시간을 포함하여 각 요청을 기록합니다. 이는 앱 성능과 비정상적인 활동에 대한 최신 정보를 얻을 수 있는 좋은 방법입니다.

app.Use(middleware.LoggingMiddleware)

각 요청은 다음과 같이 기록됩니다.

  • 시작됨: 요청 시작 시간을 기록합니다.
  • 완료: 요청이 완료되면 기간을 포함하여 기록합니다.

시간 초과 미들웨어

TimeoutMiddleware로 요청 처리에 시간 제한을 설정하여 끝없는 대기를 방지하세요. 이 미들웨어는 요청이 시간 내에 완료되지 않으면 요청을 취소하고 504 게이트웨이 시간 초과 상태를 클라이언트에 보냅니다.

import (
    "time"
    "github.com/BrunoCiccarino/GopherLight/middleware"
)

timeout := 2 * time.Second
app.Use(middleware.TimeoutMiddleware(timeout))

플러그인 인터페이스

플러그인 인터페이스는 매우 간단하지만 매우 강력합니다. 이는 단일 방법인 등록을 제공합니다. 이를 통해 앱의 라우팅 시스템에 연결하여 새로운 API 엔드포인트, 웹훅 또는 상상할 수 있는 모든 것 등 필요한 모든 경로를 추가할 수 있습니다.

등록 방법
플러그인 인터페이스의 놀라운 부분은 다음과 같습니다.

type Plugin interface {
    Register(route func(method, path string, handler func(req *req.Request, res *req.Response)))
}

Register 메소드는 다음을 지정하여 플러그인에서 새 경로를 정의할 수 있는 경로 기능을 허용합니다.

  • method: HTTP 메서드(예: "GET", "POST" 등)
  • path: 경로 경로(예: "/my-plugin-route")
  • handler: 경로에 도달했을 때 실행되는 함수입니다. 이 함수는 다음을 수신합니다:
    • req: 쿼리 매개변수, 헤더 및 본문에 액세스할 수 있는 요청 개체입니다.
    • res: 클라이언트에 데이터를 다시 보내는 응답 개체입니다.

예제 플러그인

사용자에게 인사하기 위해 /hello-plugin에 간단한 엔드포인트를 추가하는 플러그인을 생성한다고 가정해 보겠습니다. 플러그인은 다음과 같습니다.

package main

import (
    "github.com/BrunoCiccarino/GopherLight/plugins"
    "github.com/BrunoCiccarino/GopherLight/req"
)

type HelloPlugin struct{}

// Register adds a new route for the HelloPlugin.
func (p *HelloPlugin) Register(route func(method, path string, handler func(req *req.Request, res *req.Response))) {
    route("GET", "/hello-plugin", func(req *req.Request, res *req.Response) {
        res.Send("Hello from the HelloPlugin!")
    })
}

앱에 플러그인 추가

플러그인을 로드하려면 인스턴스를 생성하고 기본 앱 설정에서 Register를 호출하면 됩니다.

package main

import (
    "github.com/BrunoCiccarino/GopherLight/router"
)

func main() {
    app := router.NewApp()
    helloPlugin := &HelloPlugin{}
    helloPlugin.Register(app.Route)

    app.Listen(":3333")
}

플러그인 사용자 정의

각 플러그인은 필요한 만큼 경로를 추가할 수 있습니다. 추가 엔드포인트를 정의하려면 Register 함수에서 Route를 여러 번 호출하면 됩니다. 다양한 HTTP 메소드, 경로 및 핸들러를 사용하여 플러그인 기능을 원하는 대로 구성하세요.

릴리스 선언문 이 기사는 https://dev.to/gopherlight/how-to-write-apis-like-a-pro-in-go-with-gopherlight-3b97?1에서 복제됩니다. 침해가 있는 경우에는 Study_golang에 문의하세요. @163.com 삭제
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3