Go發送HTTP Request的方式如下。
範例環境:
- Go 1.18
事前要求
參考「Golang http handle POST JSON to struct」建立接收請求的API http://localhost:8080/employee
發送請求
下面以http.Post()
發送POST請求及JSON資料到http://localhost:8080/employee
。然後從http.Response
取得body寫出回應。
main.go
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
type Employee struct {
Id int
Name string
Age int
}
func main() {
... // GET|/employee handler, 參考:https://matthung0807.blogspot.com/2021/12/go-http-handle-post-json-to-struct.html
http.HandleFunc("/send", func(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet:
resp := Post("http://localhost:8080/employee")
fmt.Fprint(w, resp)
default:
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
}
})
http.ListenAndServe(":8080", nil)
}
func Post(url string) string {
resp, err := http.Post(
url, // target url
"application/json", // content-type
createRequestBody()) // request body
if err != nil {
panic(err)
}
defer resp.Body.Close() // 記得關閉resp.Body
if resp.StatusCode == http.StatusOK {
b, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
body := string(b)
return body
}
return ""
}
func createRequestBody() *bytes.Buffer {
emp := Employee{
Id: 1,
Name: "john",
Age: 33,
}
data, err := json.Marshal(&emp)
if err != nil {
panic(err)
}
return bytes.NewBuffer(data)
}
測試
啟動專案在以curl執行curl -X GET "http://localhost:8080/send"
呼叫GET|/send
結果如下。
$ curl -X GET "http://localhost:8080/send"
{"Id":1,"Name":"john","Age":33}
循序圖。
http://localhost:8080 http://localhost:8080
┌────────┐ ┌────────┐ ┌────────┐
│ client │ │ Server │ │ Server │
└────┬───┘ └────┬───┘ └────┬───┘
│ │ │
│ │ │
│ GET|/send │ │
curl┌┼────────────────────►┌┤ │
││ ││ │
││ ││ POST/empoyee │
││ http.Post│┼─────────────────────►┌┤
││ ││ ││
││ ││ ││
││ ││ ││
││ │┤◄─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┴┤
││ ││ │
││ │┼─print resp.Body │
│┤◄─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┴┤ │
││ │ │
└┤ │ │
│ │ │
│ │ │
▼ ▼ ▼
沒有留言:
張貼留言