开放的编程资料库

当前位置:我爱分享网 > Go教程 > 正文

如何在Golang中使用net/http创建HTTP请求

Gohttp客户端教程展示了如何在Golang中使用net/http创建HTTP请求。http客户端发送HTTP请求并从由URL标识的资源接收HTTP响应。

$ go version
go version go1.18.1 linux/amd64

我们使用Go版本1.18。

HTTP

超文本传输​​协议(HTTP)是分布式协作超媒体信息系统的应用协议。HTTP协议是万维网数据通信的基础。

去网/http

net/http包包含创建HTTP客户端和服务器的工具。可以使用http.Gethttp.Posthttp.PostFormhttp.Head轻松创建HTTP请求功能。

要设置HTTP设置,例如标头或重定向策略,我们按以下方式创建客户端:

client := &http.Client{
    CheckRedirect: redirectPolicyFunc,
}

resp, err := client.Get("http://example.com")

响应主体必须在最后关闭:

defer resp.Body.Close()

Gohttp客户端状态码

HTTP响应状态代码指示特定HTTP请求是否已成功完成。响应分为五组:

  • 信息响应(100-199)
  • 成功响应(200-299)
  • 重定向(300-399)
  • 客户端错误(400-499)
  • 服务器错误(500-599)
package main

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

func main() {

    resp, err := http.Get("http://webcode.me")

    if err != nil {

        log.Fatal(err)
    }

    fmt.Println(resp.Status)
    fmt.Println(resp.StatusCode)
}

该示例创建了一个对小型网站的GET请求。我们得到请求的状态码。

fmt.Println(resp.Status)
fmt.Println(resp.StatusCode)

Status以字符串形式给出状态,以数字形式给出StatusCode

去http客户端GET请求

以下示例在Go中创建一个简单的GET请求。

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)

func main() {

    resp, err := http.Get("http://webcode.me")

    if err != nil {
        log.Fatal(err)
    }

    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)

    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(string(body))
}

我们向webcode.me网页创建一个GET请求。

resp, err := http.Get("http://webcode.me")

使用Get函数发出获取请求。

if err != nil {
    log.Fatal(err)
}

我们检查错误。

defer resp.Body.Close()

客户端必须在完成后关闭响应主体。

body, err := ioutil.ReadAll(resp.Body)

我们使用ReadAll读取正文的内容。

fmt.Println(string(body))

我们将接收到的数据打印到控制台。

$ go run get_req.go
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="format.css">
    <title>My html page</title>
</head>
<body>
...

去http客户端HEAD请求

如果使用HTTPGET方法请求指定的资源,则HTTPHEAD方法请求返回的标头。

package main

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

func main() {

    resp, err := http.Head("http://webcode.me")

    if err != nil {

        log.Fatal(err)
    }

    for k, v := range resp.Header {

        fmt.Printf("%s %s\n", k, v)
    }
}

该示例使用http.Head发出HEAD请求并打印响应标头的所有数据。

$ go run head_req.go
Content-Length [394]
Last-Modified [Sun, 23 Jan 2022 10:39:25 GMT]
Connection [keep-alive]
Etag ["61ed305d-18a"]
Accept-Ranges [bytes]
Server [nginx/1.6.2]
Date [Mon, 14 Feb 2022 13:50:22 GMT]
Content-Type [text/html]

用户代理头

User-Agent请求标头是一个字符串,可让服务器和网络对等方识别请求用户代理的应用程序、操作系统、供应商和/或版本。

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "time"
)

func main() {

    c := http.Client{Timeout: time.Duration(3) * time.Second}

    req, err := http.NewRequest("GET", "http://webcode.me/ua.php", nil)

    if err != nil {
        log.Fatal(err)
    }

    req.Header.Add("User-Agent", "Go program")
    resp, err := c.Do(req)

    if err != nil {
        log.Fatal(err)
    }

    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)

    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(string(body))
}

该示例为其GET请求设置了一个User-Agent标头。请求的资源仅返回客户端的User-Agent字符串。

c := http.Client{Timeout: time.Duration(3) * time.Second}

我们创建超时为3秒的http客户端。

req, err := http.NewRequest("GET", "http://webcode.me/ua.php", nil)

使用http.NewRequest创建一个新请求。

req.Header.Add("User-Agent", "Go program") 

我们将User-Agent标头添加到请求中。

$ go run user_agent.go 
Go program

去http.PostForm

HTTPPOST方法向服务器发送数据。

http.PostForm向指定的URL发出POST,数据的键和值经过URL编码作为请求主体。Content-Type标头设置为application/x-www-form-urlencoded

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "net/url"
)

func main() {

    resp, err := http.PostForm("https://httpbin.org/post",
        url.Values{"name": {"John Doe"}, "message": {"Hey!"}})

    if err != nil {
        log.Fatal(err)
    }

    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)

    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(string(body))
}

在示例中,我们向https://httpbin.org/post网站发送POST请求,该网站是为开发者提供的在线测试服务。

$ go run post_form.go 
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "message": "Hey!", 
    "name": "John Doe"
  }, 
  "headers": {
    "Accept-Encoding": "gzip", 
    "Content-Length": "28", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Go-http-client/2.0", 
    "X-Amzn-Trace-Id": "Root=1-620a63eb-5b49f82c137a95e06bad94e3"
  }, 
  "json": null, 
  "origin": "188.167.250.179", 
  "url": "https://httpbin.org/post"
}

在本教程中,我们在Go中创建了GET和POST请求。

列出所有Go教程。

未经允许不得转载:我爱分享网 » 如何在Golang中使用net/http创建HTTP请求

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏