일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- C
- http
- mutex
- GO 언어
- package
- tcp
- API
- File
- window
- Sync
- 영화
- 책
- FOR
- windows
- JavaScript
- Close
- Golang
- go언어
- install
- go
- Python
- 리뷰
- range
- Linux
- c++
- bitcoin
- channel
- Callback
- write
- json
- Today
- Total
Code Habit
Golang ) http 서버 - Get/Post 요청 처리하기 본문
앞에서 포스팅한 "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()로 닫아주어야 한다.