Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

Code Habit

Golang ) http 서버 - Get/Post 요청 처리하기 본문

카테고리 없음

Golang ) http 서버 - Get/Post 요청 처리하기

코드베어 2020. 6. 24. 07:19

앞에서 포스팅한 "net/http" 패키지로 http 서버 구현 후 Get/Post 요청을 구분하여 처리하는 예제이다.

 

예제 - 서버

// main.go
package main
 
import (
    "fmt"
    "io/ioutil"
    "net/http"
)
 
func handler(rw http.ResponseWriter, req *http.Request) {
    fmt.Println("Method : ", req.Method)
    fmt.Println("URL : ", req.URL)
    fmt.Println("Header : ", req.Header)
 
    b, _ := ioutil.ReadAll(req.Body)
    defer req.Body.Close()
    fmt.Println("Body : "string(b))
 
    switch req.Method {
    case "POST":
        rw.Write([]byte("post request success !"))
    case "GET":
        rw.Write([]byte("get request success !"))
    }
}
 
func main() {
    err := http.ListenAndServe(":8000", http.HandlerFunc(handler))
    if err != nil {
        fmt.Println("Failed to ListenAndServe : ", err)
    }
}

http.ListenAndServe() 함수로 로컬에 8000번 포트에 http 서버를 개설하고 요청을 처리할 handler 함수를 등록한다. *http.Request의 Method에는 'POST/GET' 요청을 구분해주는 값이 들어 있어 이를 switch 문으로 분기 한다. ioutil.ReadAll 함수를 통해 요청의 바디부분을 읽어와 사용할 수 있는데 사용한 바디 데이터는 Close()로 닫아주어야 한다. 마지막으로 http.ResponseWriter의 Write 함수를 통해 http 요청에 대해 응답해 줄 수 있다.

 

예제 - POST 전송

// main.go
package main
 
import (
    "bytes"
    "fmt"
    "io/ioutil"
    "net/http"
)
 
func main() {
 
    // Post 호출
    reqBody := bytes.NewBufferString("Post body")
    resp, err := http.Post("http://127.0.0.1:8000/Hello""text/plain", reqBody)
    if err != nil {
        panic(err)
    }
 
    defer resp.Body.Close()
 
    // 응답 확인
    respBody, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }
 
    fmt.Println(string(respBody))
}

로컬(127.0.0.1)에 8000포트로 '/Hello' 경로에 POST 요청을 한다. 형식은 'text/plain'이고 바디엔 텍스트 "Post body"가 들어간다. 요청에 대한 응답을 받는데 ioutil.ReadAll 함수로 읽어오고 사용한 응답 데이터는 Close() 함수로 닫아 주어야 한다.

 

* 위 서버에 예제에서 http.Request의 URL 멤버에 '/Hello' 경로가 들어가는 것이다. *

 

예제 - GET 전송

// main.go
package main
 
import (
    "fmt"
    "io/ioutil"
    "net/http"
)
 
func main() {
    // Get 호출
    resp, err := http.Get("http://127.0.0.1:8000/Hello")
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
 
    data, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(data))
}

http.Get() 함수를 통해 로컬에 8000포트에 '/Hello' 경로에 http 요청을 한다. ioutil.ReadAll() 함수로 응답 데이터를 읽어온 후 문자열 변환하여 출력한다. 여기서도 역시 사용한 응답 데이터는 Close()로 닫아주어야 한다.