GO 發起HTTP請求調用接口


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")
  • 動態參數的GET請求,代碼如下
// 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請求

  • 使用client
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請求

  • 不用client的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM