Go에서 중간 제품 만들기.

클라이언트로서 서버에 요청을 하면 응답을 받기 전에 상기 요청에 대해 일련의 처리를 수행합니다.일부 처리는 자원 요청의 기초 응용 프로그램에서 이루어졌지만 요청-응답 주기 중 최종 결과를 얻기 전에 다른 몇 개의 응용 프로그램이 상호작용을 하고 요청/응답을 변경할 수 있습니다.이런 제3자 응용 프로그램은 통상적으로 중간부품이라고 불린다.
만약python/javascript 개발자라면, "중간부품"이라는 용어에 익숙해졌을 것입니다. 왜냐하면 API를 구축할 때 그것들과 상호작용을 할 수 있기 때문입니다.
중간부품은 기본적으로 수식된 기능으로 요청 처리 프로그램을 포장하고 요청/응답 생명주기에 추가 기능을 제공한다.
django에서 중간부품은 특정한 순서에 따라 목록에 추가됩니다. 이로써 django는 요청을 처리할 때 Top-button 방법으로 처리할 수 있습니다.

응답을 되돌릴 때의 단추 맨 위에 있는 방법입니다.
다른 한편, go에서는 간단하게 함수를 만들어서 중간부품을 추가할 수 있습니다. 이 함수 수신 처리 프로그램은 매개 변수로 하고 http에 되돌려줍니다.매개 변수로서의handler 방법;내가 무슨 뜻이야?간단한 예를 들어 실험을 진행해 보겠습니다.
package main

import (
    "fmt"
    "log"
    "net/http"
    "time"
)

func main() {
    mux := http.NewServeMux()
    indexHandler := http.HandlerFunc(index)
    server := &http.Server{
        Addr:    ":8000",
        Handler: mux,
    }
    mux.Handle("/index", IndexLogger(indexHandler))

    log.Printf("Serving http on %s", server.Addr)
    log.Fatal(server.ListenAndServe())
}

func IndexLogger(next http.Handler) http.Handler {

    return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
        startTime := time.Now()
        log.Printf("%s at %s", r.Method, r.URL.Path)
        next.ServeHTTP(rw, r)
        log.Printf("Finished %s in %v", r.URL.Path, time.Since(startTime))
    })
}

func index(w http.ResponseWriter, r *http.Request) {

    fmt.Fprintf(w, "hello welcome to the index page")
}

이 간단한 예에서, 우리는 색인 Uri를 요청할 때마다 로그를 기록하는 기본적인 RequestLogger 중간부품을 만들었습니다.
우리가 뛸 때.go run main.go그런 다음 localhost:8000\index로 이동하면 다음과 같은 출력이 표시됩니다.
$ go run main.go
2022/03/03 13:28:00 Serving http on :8000
2022/03/03 13:28:07 GET at /welcome
2022/03/03 13:28:07 Finished /welcome in 34.394µs
ServeHTTP는 현재 중간부품의 메소드에서 프로세서의 함수를 호출합니다.
설레죠?우리는api 서비스에 무한한 기능을 제공할 수 있습니다. 예를 들어 프로그램의 모든 등록 루트에 이 레코더 서비스를 포함하기를 원합니다. 우리는 필요한 함수의 처리 프로그램과 indexLogger 함수를 포장하기만 하면 됩니다. 예를 들어:
func welcome(rw http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(rw, "Welcome to the welcome page")
}

// edit main function to include the welcome handler

WelcomeHandler := http.HandlerFunc(welcome)
mux.Handle("/welcome", IndexLogger(WelcomeHandler))
로컬 서버를 다시 실행하고/welcome로 이동할 때 터미널에 기록된 응답을 받습니다. 이것은 Index Logger 기능도 welcome URL 경로에 추가되었음을 나타냅니다. 이것은 매우 멋있습니다. 왜냐하면 특정한 ui 경로에서 유사한 행동을 할 수 있을 뿐만 아니라 DRY 프로그래밍 원칙도 지원하기 때문입니다.

여러 http 중간부품 링크
go에서 http중간부품은 httpHandler를 받고 httpHandler로 되돌아오기 때문에 기본 프로그램/함수를 호출하기 전에 서로 호출하는 여러 개의 중간부품을 쉽게 연결할 수 있습니다.
예를 들어, URI 경로의 Requests 메서드를 검사하고 허용되는 메서드를 반환하는 다른 중간 함수를 작성합니다.
요청 방법이 GET 또는 not-allowed인 경우 그렇지 않은 경우
func CheckRequestMethod(next http.Handler) http.Handler {

return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
        if r.Method != "GET" {
            log.Printf("Only GET requests are accepted on the path!")
            next.ServeHTTP(rw, r)
        fmt.Fprintf(rw, "Method not allowed!")
        } else {
        log.Printf("Method allowed")
        next.ServeHTTP(rw, r)
        fmt.Fprintf(rw, "Your request is valid!")
             log.Printf("Finished checking......")
        }
    })
}


// edit main function to wrap CheckRequestMethod on one of our registered routes.

mux.Handle("/welcome", CheckRequestMethod(IndexLogger(WelcomeHandler)))
로컬 서버를 다시 실행하고/welcome path를 탐색할 때, CheckRequestMethod와 IndexLogger가 응답을 되돌리기 전에 welcomeHandler를 돌아가며 실행하는 것을 알 수 있습니다.
$ go run main.go
2022/03/03 19:57:29 Serving http on :8000
2022/03/03 19:57:41 Method allowed
2022/03/03 19:57:41 GET at /welcome
2022/03/03 19:57:41 Finished /welcome in 30.615µs
2022/03/03 19:57:41 Finished checking......

Http 중간부품을 연결하는 프로세스
다음 코드를 고려하십시오.
func ProgramFlow() {

    fmt.Println("First function body")
    func() {
        fmt.Println("Second function body")
        func() {
            fmt.Println("Third Function body")
            time.Sleep(3 * time.Second)
            fmt.Println("Finished third function body")
        }()
        fmt.Println("Finished second function body")
    }()
    fmt.Println("Finished first function body!")

}
주 함수에서 ProgramFlow () 를 호출할 때, 우리가 얻은 출력은
$ run main.go
First function body
Second function body
Third Function body
Finished third function body
Finished second function body
Finished first function body!
이것은 go에 모든 함수가 자신의 goroutine에 놓여 있기 때문이다. go의 출력은 Wait Group에 저장되어 있고, 대응하는 모든 함수가 되돌아올 때까지 저장된 후에야 출력을 되돌려줍니다. 비슷한 끼워 넣는 중간부품도 같은 방식으로 처리됩니다.탐색할 때\환영합니다;
  • 웹 서버는 다음 프로세서를 실행하기 전에 리퀘스트 방법에 따라 응답을 기록하는 컨트롤 흐름을 CheckRequestMethod에 전달합니다.
  • 다음 처리 프로그램도 중간부품으로 다음 처리 프로그램을 실행하기 전에 요청한 상세한 정보를 기록합니다.
  • 운영 애플리케이션이 정상적으로 실행 및 반환
  • IndexLogger의 최종 응답 문서화
  • CheckRequestMethod에서 최종 응답 기록

  • go의 제3자 중간부품
    지금까지 우리는 고의 중간부품이 어떻게 작동하는지, 그리고 필요한 곳에서 응용 프로그램에서 중간부품을 어떻게 작성하는지 이해할 수 있다.응용 프로그램을 구축할 때, 많은 라이브러리에서 몇 가지 기존의 중간부품 구성 요소를 실현합니다.최상의 용례에 적응하기 위해 많은 처리 프로그램을 만들고 적극적으로 유지보수했습니다. http://www.gorillatoolkit.org/ 탐색해서 이미 구축된 처리 프로그램을 보십시오. 이 처리 프로그램은 다음 대형 프로젝트에 사용할 수 있습니다.

    Alice 패키지로 중간 제품 연결
    Alice는 여러 개의 중간부품 기능과 응용 프로그램 처리 프로그램을 연결하는 데 사용되는 고 라이브러리입니다.
    Alice의 경우 위 예제에서 설명한 것처럼 각 중간부품 프로세서를 다음 매개변수로 전달할 필요가 없습니다.
    mux.Handle("/welcome",CheckRequestMethod(IndexLogger(WelcomeHandler)))
    
    반대로 우리는 이렇게 할 수 있다
    import "github.com/justinas/alice"
    
    // edit our main function to create a variable that stores all our middlewares 
    
    allhandlers := alice.New(CheckRequestMethod, IndexLogger)
    
    // add middlewares to registered route
    
    mux.Handle("/welcome", allhandlers.Then(WelcomeHandler))
    
    우리가 모든 중간 제품을 앨리스와 묶은 것처럼.

    결론
    중간부품은 반복적으로 사용할 수 있는 코드 세션을 작성하는 좋은 방법으로 우리가 구축하고 있는 모든 것에 강력한 기능을 추가할 수 있다. 우리는 중간부품을 사용하여 무엇을 할 수 있는지의 표면만 건드릴 수 있다. 뒷글에서 응용 프로그램에 적용되는 중간부품을 어떻게 구축하는지 상세하게 소개할 것이다.
    동시에, 나는 당신이 이 주제에 관한 문장/동영상을 더 많이 읽어서 중간 제품을 어떻게 구축하는지 더욱 깊이 있게 이해할 수 있도록 건의합니다.
    이 글에 대한 당신의 견해와 사용자 체험을 개선하기 위해 가능한 모든 수정을 알 수 있습니다. 읽어 주셔서 감사합니다. 즐거운 시간 되세요.

    좋은 웹페이지 즐겨찾기