가장 간단한 Go API 서버

16195 단어 Go

가장 간단한 Go API 서버


우선


이번 작업은 방문 후 운세를 되돌려주는 신싸인 서버입니다!GET '/oracle'이면 JSON으로 상태 코드와 운세를 되돌려 주는 것을 만든다.

"net/http" 를 사용하여 서버 구축


실제로 나는 서버를 구축하고 싶다.net/http 패키지를 사용하면 서버를 쉽게 구축할 수 있습니다.
다음은 메인에 쓰여있습니다. localhost:8080 http 서버가 있습니다!아주 간단해요.http.ListenAndServe(":8080", nil)  
그리고 접근 "/" 시 일부 내용을 표시하기 위해 프로세서를 추가합니다.
func rootHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "<h1>Oracle</h1>")
}

func main() {
    http.HandleFunc("/", rootHandler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}
http.HandleFunc() 는 첫 번째 매개 변수를 통해 두 번째 매개 변수로 처리됩니다.
이 함수는 DefaultServeMux에서 첫 번째 매개 변수에 제공된 모드 등록 http 처리 프로그램입니다.
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    DefaultServeMux.HandleFunc(pattern, handler)
}
이 http 프로세서는 인터페이스에서 패키지에 정의된 첫 번째 파라미터ResponseWriter, 두 번째 파라미터*Request의 ServeHTTP입니다.
type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}
즉, 정의식 형식으로 처리 프로그램(e.g.rootHandler을 실현하면 Handler 유형이 되고 http.hundleFunc()의 두 번째 매개 변수가 될 수 있다.
(여기서 먼저 ServeHTTP 어떤 사람인지 조용히 옆에 두세요.)
func rootHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "<h1>Oracle</h1>")
}
어쨌든 이렇게 go run fileName 하면 localhost:8080 방문할 수 있다.
액세스하면 H1 레이블의 모양에 Oracle 문자열이 표시됩니다.

JSON 돌려줘.


그럼 본론.
JSON으로 돌아가는 프로세서를 실현하세요.
이번에는 JSON이 돌아올지 확인하기 위해서 잠시 브라우저에 표시하고 싶습니다.
먼저 struct 로 데이터를 정의합니다.(C를 아는 사람은 잘 아는 struct)
type ResponseData struct {
    Status int    `json:"status"`
    Data   string `json:"data"`
}
이번에 반한 곳이 하나 있다.
Go 사양은 struct 등 변수의 시작 문자를 대문자로 설정하면 다른 패키지에서 액세스할 수 있고 소문자로 설정하면 패키지에서 액세스할 수 있습니다.
처음에 밑줄에 struct 내의 변수를 썼을 때 화면에 빈 데이터가 표시됩니다.
포장 안에서도 출력할 때 반드시 상자로 써야 한다.
길어졌어.
다음은 http 처리 프로그램의 실현이다."/" 때와 같이 프로세서를 등록합니다.
또 이번에는 추첨이기 때문에 무작위로 세어야 한다.
따라서main 함수를 실행할 때마다seed를 설정합니다.
func main() {
    rand.Seed(time.Now().UnixNano())

    http.HandleFunc("/oracle", oracleHandler)
    http.HandleFunc("/", rootHandler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}
그럼 oracleHandler의 내용을 살펴보자.
우선, 서명 형식을 저장하는 문자열 그룹을 정의합니다.
여기const에서 사용하고 싶은데 여러 가지가 있는데 가장 간단하게 설치할 수 있어요.
그리고 ResponseDate형 성명 변수response로 상태 코드 200과 아까 수조에 랜덤수(0~6)를 대입하여 얻은 운세를 초기화합니다."encoding/json" 패키지를 사용하여 response를 JSON으로 인코딩합니다.
인코딩된 데이터와 오류가 반환값으로 반환됩니다.
우선, 이 오류를 사용하여 간단한 이상 처리를 합니다.json.Marshal 우수하다
  • "net/http"
  • http.StatusOK === 200
  • 이렇게 하면 간단하고 알기 쉽게 HTTP 상태 코드를 사용할 수 있다.
    마지막으로 매개변수 사용http.StatusInternalServerError === 500HTTP 응답 헤더에 JSON으로 되돌아오는 가슴을 쓰고 문자열에 재생된 데이터를 응답에 씁니다.
    여기서 문자열 분배는 w http.ResponseWriterbytes 형식의 데이터 처리이기 때문이다.
    func oracleHandler(w http.ResponseWriter, r *http.Request) {
        // "/oracle"
        oracles := []string{"大吉", "中吉", "小吉", "末吉", "吉", "凶", "大凶"}
        response := ResponseData{http.StatusOK, oracles[rand.Intn(7)]}
    
        res, err := json.Marshal(response)
    
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
    
        w.Header().Set("Content-Type", "application/json")
        fmt.Fprint(w, string(res))
    }
    
    이렇게 하면 완성된다.
    API에 실제로 요청을 제출합니다.
    이런 식으로 호응 받을 수 있잖아.

    마지막으로 원본 코드를 넣으세요.

    소스 코드

    import (
        "encoding/json"
        "fmt"
        "log"
        "math/rand"
        "net/http"
        "time"
    )
    
    type ResponseData struct {
        Status int    `json:"status"`
        Data   string `json:"data"`
    }
    
    func oracleHandler(w http.ResponseWriter, r *http.Request) {
        // "/oracle"
        oracles := []string{"大吉", "中吉", "小吉", "末吉", "吉", "凶", "大凶"}
        response := ResponseData{http.StatusOK, oracles[rand.Intn(7)]}
    
        res, err := json.Marshal(response)
    
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
    
        w.Header().Set("Content-Type", "application/json")
        fmt.Fprint(w, string(res))
    }
    
    func rootHandler(w http.ResponseWriter, r *http.Request) {
        // "/"
        fmt.Fprintf(w, "<h1>Oracle</h1>")
    }
    
    func main() {
        rand.Seed(time.Now().UnixNano())
    
        http.HandleFunc("/oracle", oracleHandler)
        http.HandleFunc("/", rootHandler)
        log.Fatal(http.ListenAndServe(":8080", nil))
    }
    

    마지막


    마지막 여러분, 이 졸렬한 보도를 보고 죄송합니다. 감사합니다.
    첫 기사라서 원래 조금 더 좋은 걸로 만들고 싶어요!!

    좋은 웹페이지 즐겨찾기