深入了解golang http get

一、基本介紹

golang是一種快速編譯和部署的語言,它的性能非常好。golang內置的http包是非常強大的,可以輕鬆地實現HTTP(S)的客戶端和伺服器,包括GET和POST等HTTP方法。

http GET是一種最常用的HTTP請求方法之一,可以用於從伺服器獲取信息。golang內置的http包也提供了http GET請求的實現,包括最簡單的GET請求方法和一些高級功能。

下面是一個簡單的http GET請求的示例代碼:

package main

import (
    "fmt"
    "net/http"
)

func main() {
    resp, err := http.Get("https://www.google.com")
    if err != nil {
        fmt.Println("http get error:", err)
        return
    }
    defer resp.Body.Close()

    fmt.Println("http status code:", resp.StatusCode)
    fmt.Println("http proto:", resp.Proto)
    fmt.Println("http content length:", resp.ContentLength)
}

二、GET請求參數

在實際應用中,我們通常需要在GET請求中傳遞一些參數。這些參數可以通過URL的查詢字元串(query string)傳遞,也可以在URL路徑中傳遞。

在golang中,我們可以很方便地使用net/url包構造URL,下面是一個示例代碼:

package main

import (
    "fmt"
    "net/http"
    "net/url"
)

func main() {
    query := url.Values{}
    query.Set("key1", "value1")
    query.Set("key2", "value2")

    url := url.URL{
        Scheme:   "https",
        Host:     "httpbin.org",
        Path:     "/get",
        RawQuery: query.Encode(),
    }

    resp, err := http.Get(url.String())
    if err != nil {
        fmt.Println("http get error:", err)
        return
    }
    defer resp.Body.Close()

    fmt.Println("http status code:", resp.StatusCode)
    fmt.Println("http proto:", resp.Proto)
    fmt.Println("http content length:", resp.ContentLength)
}

三、自定義請求頭

在http請求中,請求頭(header)中包含了一些元數據,如User-Agent、Accept等。某些情況下,我們需要自定義請求頭來修改請求行為,比如模擬某個特定瀏覽器或者請求json格式數據。

在golang中,我們可以通過創建一個http.Request結構體來自定義請求頭,示例代碼如下:

package main

import (
    "fmt"
    "net/http"
    "net/url"
)

func main() {
    query := url.Values{}
    query.Set("key1", "value1")
    query.Set("key2", "value2")

    url := url.URL{
        Scheme:   "https",
        Host:     "httpbin.org",
        Path:     "/get",
        RawQuery: query.Encode(),
    }

    req, err := http.NewRequest("GET", url.String(), nil)
    if err != nil {
        fmt.Println("http new request error:", err)
        return
    }

    req.Header.Set("User-Agent", "Mozilla/5.0")
    req.Header.Set("Accept", "application/json")

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        fmt.Println("http get error:", err)
        return
    }
    defer resp.Body.Close()

    fmt.Println("http status code:", resp.StatusCode)
    fmt.Println("http proto:", resp.Proto)
    fmt.Println("http content length:", resp.ContentLength)
}

四、超時設置

在某些場景下,我們需要設置http請求的超時時間,以防止請求時間過長導致線程被卡死等問題。

在golang中,我們可以通過設置http.Client的Timeout屬性來實現超時設置。示例代碼如下:

package main

import (
    "fmt"
    "net/http"
    "net/url"
    "time"
)

func main() {
    query := url.Values{}
    query.Set("key1", "value1")
    query.Set("key2", "value2")

    url := url.URL{
        Scheme:   "https",
        Host:     "httpbin.org",
        Path:     "/delay/5",
        RawQuery: query.Encode(),
    }

    clt := http.Client{
        Timeout: 3 * time.Second,
    }

    resp, err := clt.Get(url.String())
    if err != nil {
        fmt.Println("http get error:", err)
        return
    }
    defer resp.Body.Close()

    fmt.Println("http status code:", resp.StatusCode)
    fmt.Println("http proto:", resp.Proto)
    fmt.Println("http content length:", resp.ContentLength)
}

五、並發請求

在實際應用中,我們通常需要一次性並發請求多個http介面,以提高請求效率。

在golang中,我們可以使用goroutine和channel來實現並發請求。示例代碼如下:

package main

import (
    "fmt"
    "net/http"
    "net/url"
)

func worker(urlCh chan string, resultCh chan string) {
    for url := range urlCh {
        resp, err := http.Get(url)
        if err != nil {
            resultCh <- fmt.Sprintf("%s: %v", url, err)
        } else {
            resultCh <- fmt.Sprintf("%s: %v", url, resp.StatusCode)
        }
    }
}

func main() {
    urls := []string{
        "https://www.google.com",
        "https://www.baidu.com",
        "https://www.sina.com.cn",
    }

    urlCh := make(chan string, len(urls))
    resultCh := make(chan string, len(urls))

    for i := 0; i < 3; i++ {
        go worker(urlCh, resultCh)
    }

    for _, url := range urls {
        urlCh <- url
    }

    close(urlCh)

    for i := 0; i < 3; i++ {
        fmt.Println(<-resultCh)
    }
}

六、總結

本文詳細介紹了golang http GET請求的基本用法,包括請求參數、自定義請求頭、超時設置和並發請求等。通過本文的學習,讀者可以更好地了解和使用golang內置的http包,並在實際應用中發揮出更好的作用。

原創文章,作者:FATOL,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/333549.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FATOL的頭像FATOL
上一篇 2025-02-01 13:34
下一篇 2025-02-01 13:34

相關推薦

  • 使用Golang調用Python

    在現代軟體開發中,多種編程語言的協作是相當普遍的。其中一種使用場景是Golang調用Python,這使得在使用Python庫的同時,可以利用Golang的高性能和強大並發能力。這篇…

    編程 2025-04-29
  • 使用Golang創建黑色背景圖片的方法

    本文將從多個方面介紹使用Golang創建黑色背景圖片的方法。 一、安裝必要的代碼庫和工具 在開始創建黑色背景圖片之前,我們需要先安裝必要的代碼庫和工具: go get -u git…

    編程 2025-04-29
  • Elasticsearch API使用用法介紹-get /_cat/allocation

    Elasticsearch是一個分散式的開源搜索和分析引擎,支持全文檢索和數據分析,並且可伸縮到上百個節點,處理PB級結構化或非結構化數據。get /_cat/allocation…

    編程 2025-04-28
  • 為什麼要加請求頭(HTTP Header)?

    在進行網頁抓取(Web Scraping)時,請求頭(HTTP Header)扮演著非常重要的角色。請求頭中包含了用戶代理(User Agent)、cookie、referer等信…

    編程 2025-04-27
  • SpringBoot Get方式請求傳參用法介紹

    本文將從以下多個方面對SpringBoot Get方式請求傳參做詳細的闡述,包括URL傳參、路徑傳參、請求頭傳參、請求體傳參等,幫助讀者更加深入地了解Get請求方式下傳參的相關知識…

    編程 2025-04-27
  • HTTP請求方式的選擇:POST還是GET?

    對於使用xxl-job進行任務調度的開發者,通常需要發送HTTP請求來執行一些任務。但是在發送請求時,我們總是會遇到一個問題:是使用POST還是GET?下面將從多個方面對這個問題進…

    編程 2025-04-27
  • 如何快速發布http介面

    想要快速發布http介面,可以從以下幾個方面入手。 一、選擇合適的框架 選擇合適的框架對於快速發布http介面非常重要。目前比較受歡迎的框架有Flask、Django、Tornad…

    編程 2025-04-27
  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25

發表回復

登錄後才能評論