您的位置:

深入了解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包,并在实际应用中发挥出更好的作用。