19.创建HTTP客户端

发出GET请求

Go语言在net/http包中提供了一个快捷方法,可用于发出简单的GET请求。使用这个方法意味着不需要考虑如何配置HTTP客户端以及如何设置请求报头

在这里,我们使用上一章构建的HTTP服务器

package main

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

func main(){
    //发出GET请求
    response,err := http.Get("http://127.0.0.1:8000/?foo-siqu")
    if err !=nil{
        log.Fatal(err)
    }

    //在函数退出时,执行清理操作
    defer response.Body.Close()

    body,err := ioutil.ReadAll(response.Body)
    if err != nil{
        log.Fatal(err)
    }
    fmt.Printf("%s",body)
}

发出POST请求

package main

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

func main(){
    postData := strings.NewReader(`{"some":"json"}`)
    response,err := http.Post("http://127.0.0.1:8000","application/json",postData)
    if err != nil{
        log.Fatal(err)
    }

    defer response.Body.Close()

    body,err := ioutil.ReadAll(response.Body)
    if err != nil{
        log.Fatal(err)
    }
    fmt.Printf("%s",body)
}

// D:\Backup\Documents\golang>go run test_client.go
// hello
// {"some":"json"}
// POST
  • 使用方法post发出POST请求,其中第一个参数是要发送到的URL,第二个为数据的内容类型,第三个为数据本身
  • 声明变量postData并将一个JSON字符串赋给它。这里使用了标准库strings将其转换为io.Reader,为传输做准备

进一步控制HTTP请求

要进一步控制HTTP请求,应使用自定义的HTTP客户端

package main

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

func main(){
    client := &http.Client{}
    request,err := http.NewRequest("GET","http://127.0.0.1:8000/?name=siqu",nil)
        if err != nil {
            log.Fatal(err)
        }
    response,err := client.Do(request)
    defer response.Body.Close()

    body,err := ioutil.ReadAll(response.Body)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("%s",body)
}

// D:\Backup\Documents\golang>go run test_client.go
// hello
// name:siqu
// GET
  • 不使用net/http包的快捷方法Get,而创建一个HTTP客户端
  • 使用方法NewRequest向网站发出GET请求
  • 使用Do发送请求并处理响应

调试HTTP请求

可以使用net/http/httputil包中的函数来进行调试,这些方法显示请求和响应的报头

package main

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

func main(){
    debug := os.Getenv("DEBUG")
    client := &http.Client{}
    request,err := http.NewRequest("GET","http://127.0.0.1:8000/?name=siqu",nil)
        if err != nil {
            log.Fatal(err)
        }

    if debug =="1"{
        debugRequest,err := httputil.DumpRequestOut(request,true)
        if err !=nil {
            log.Fatal(err)
        }
        fmt.Printf("%s",debugRequest)
    }
    response,err := client.Do(request)
    defer response.Body.Close()

    if debug =="1"{
        debugResponse,err := httputil.DumpResponse(response,true)
        if err != nil{
            log.Fatal(err)
        }
        fmt.Printf("%s",debugResponse)
    }

    body,err := ioutil.ReadAll(response.Body)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("%s",body)
}

// D:\Backup\Documents\golang>set DEBUG=1
// D:\Backup\Documents\golang>go run test_client.go
// GET /?name=siqu HTTP/1.1
// Host: 127.0.0.1:8000
// User-Agent: Go-http-client/1.1
// Accept-Encoding: gzip

// HTTP/1.1 200 OK
// Content-Length: 19
// Content-Type: text/plain; charset=utf-8
// Date: Fri, 29 Jan 2021 01:08:07 GMT

// hello
// name:siqu
// GEThello
// name:siqu
// GET

要想请求JSON数据,可修改客户端,设置一个请求JSON的报头

request.Header.Add("Accept","application/json")

处理超时

在有的时候,由于各种原因,我们不能让客户端一直响应下去,因此,我们需要设置一个超时时间,如果说客户端在响应的过程当中,超过这个时间,就返回一个超时信息

//在50ms内完成请求
client := &http.Client{
    Timeout : 50 * time*Millisecond,
}

//在1s内完成请求
client := &http.Client{
    Timeout : 1 * time * Second,
}
© 版权声明
THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
四曲的头像-四曲博客

昵称

取消
昵称表情代码图片