GO 發起HTTP請求調用接口
一、Go發起GET請求
1.1、不帶參數的GET請求
func HttpGet(url string) error {
// 請求xx網站首頁
resp, err := http.Get(url)
if err != nil {
return err
}
// 延遲關閉
defer resp.Body.Close()
//
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
// 請求結果
fmt.Println(string(body))
// 請求頭
fmt.Println(resp.Header)
// 請求相應碼
fmt.Println(resp.Status)
return nil
}
1.2、帶參數的GET請求
- 靜態的參數,即放到url中的參數手動拼接url,然后發送GET請求即可,也是調上面的HttpGet函數即可
HttpGet("http://www.baidu.com?name=Paul_Chan&age=26")
// URL+參數拼接
func GetUrlPath(dUrl string, param map[string]string) (urlPath string, err error) {
// 參數設置對象
params := url.Values{}
// 請求URL
Url, err := url.Parse(dUrl)
if err != nil {
fmt.Println(err)
return "", err
}
// 參數設置, K V形式, 可以設置多個
for k, v := range param {
params.Set(k, v)
}
// 有中文參數,這個方法會進行URLEncode, 沒有中文也加上這兩句
Url.RawQuery = params.Encode()
//攜帶參數以后的URL
urlPath = Url.String()
return urlPath, nil
}
func main() {
param := make(map[string]string, 0)
param["name"] = "Paul_Chan"
param["age"] = "0"
URL, err := GetUrlPath("http://www.baidu.com", param)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(URL)
}
1.3、解析JSON類型的返回結果
// 定義一個結構體,接收返回的json數據
type result struct {
Name string `json:"name"`
Age int64 `json:"age"`
}
func main() {
// 請求JSON返回的數據:{"age":18,"name":"tom"}, 自定義個接口模擬下數據即可
resp, err := http.Get("http://127.0.0.1:8000/test")
if err != nil {
fmt.Println(err)
return
}
// 延時關閉
defer resp.Body.Close()
// 返回的結果resp.Body
body, _ := ioutil.ReadAll(resp.Body)
var res result
// 把請求到的數據Unmarshal到res中
err = json.Unmarshal(body, &res)
if err != nil {
fmt.Println(err)
return
}
// 拿到數據以后,就可以自行處理數據了,比如存到數據庫里
fmt.Printf("%#v", res)
}
1.4、GET請求添加請求頭
- 有時需要在請求的時候設置頭參數、cookie之類的數據,就可以使用http.Do方法
client := &http.Client{}
url := "https://www.kuaidaili.com/free/inha"
request, err := http.NewRequest("GET", url, nil)
if err != nil {
fmt.Print(err)
return
}
request.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36")
request.Header.Add("Host", "www.kuaidaili.com")
resp, err := client.Do(request)
if err != nil {
fmt.Print(err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Print(err)
return
}
fmt.Print(string(body))
二、Go發起POST請求
2.1、方式一
func main() {
urlP := "http://127.0.0.1:8080/loginJSON"
// urlValues ---> map[string][]string
urlValues := url.Values{}
// 參數
urlValues.Add("user", "q1mi")
urlValues.Add("password", "123456")
// 通過http.PostForm請求第三方接口
resp, err := http.PostForm請求第三方接口(urlP, urlValues)
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
// 返回結果
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
// 狀態碼
fmt.Println(resp.Status)
}
2.2、方式二
func main() {
urlP := "http://127.0.0.1:8080/loginJSON"
// 參數
urlValues := url.Values{
"user": {"q1mi"},
"password": {"123456"},
}
// 編碼
reqBody := urlValues.Encode()
// 通過http.Post請求第三方接口
resp, err := http.Post(urlP, "text/html", strings.NewReader(reqBody))
if err != nil {
fmt.Println(err)
return
}
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
fmt.Println(resp.StatusCode)
}
2.3、發送JSON數據的post請求
func main() {
urlP := "http://127.0.0.1:8080/loginJSON"
client := &http.Client{}
// 參數
data := make(map[string]interface{})
data["user"] = "q1mi"
data["password"] = "123456"
// Marshal
bytesData, _ := json.Marshal(data)
req, err := http.NewRequest("POST", urlP, bytes.NewReader(bytesData))
if err != nil {
fmt.Println(err)
return
}
resp, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body), resp.StatusCode)
}
2.3、發送JSON數據的post請求
func main() {
urlP := "http://127.0.0.1:8080/loginJSON"
// 參數
data := make(map[string]interface{})
data["user"] = "q1mi"
data["password"] = "123456"
// Marshal
bytesData, _ := json.Marshal(data)
// 使用http.Post請求
resp, _ := http.Post(urlP, "application/json", bytes.NewReader(bytesData))
body, _ := ioutil.ReadAll(resp.Body)
// 打印返回結果
fmt.Println(string(body), resp.StatusCode)
}
參考:
https://blog.csdn.net/jxwBlog/article/details/111190517