V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mikemintang
V2EX  ›  问与答

「goz」开源库,在 Go 中快速发起 HTTP 请求

  •  
  •   mikemintang · 2020-02-16 09:35:47 +08:00 · 1270 次点击
    这是一个创建于 1536 天前的主题,其中的信息可能已经有所发展或是发生改变。

    goz 是一个用于在 Go 代码中快速发起 HTTP 请求的开源库, 部分实现参考了 PHP 流行请求库: guzzle

    安装

    go get -u github.com/idoubi/goz
    

    文档

    API 文档地址: https://godoc.org/github.com/idoubi/goz

    基本使用

    package main
    
    import (
        "github.com/idoubi/goz"
    )
    
    func main() {
        cli := goz.NewClient()
    
    	resp, err := cli.Get("http://127.0.0.1:8091/get")
    	if err != nil {
    		log.Fatalln(err)
    	}
    
    	fmt.Printf("%T", resp)
    	// Output: *goz.Response
    }
    

    查询参数

    • map 形式
    cli := goz.NewClient()
    
    resp, err := cli.Get("http://127.0.0.1:8091/get-with-query", goz.Options{
        Query: map[string]interface{}{
            "key1": "value1",
            "key2": []string{"value21", "value22"},
            "key3": "333",
        },
    })
    if err != nil {
        log.Fatalln(err)
    }
    
    fmt.Printf("%s", resp.GetRequest().URL.RawQuery)
    // Output: key1=value1&key2=value21&key2=value22&key3=333
    
    • 字符串形式
    cli := goz.NewClient()
    
    resp, err := cli.Get("http://127.0.0.1:8091/get-with-query?key0=value0", goz.Options{
        Query: "key1=value1&key2=value21&key2=value22&key3=333",
    })
    if err != nil {
        log.Fatalln(err)
    }
    
    fmt.Printf("%s", resp.GetRequest().URL.RawQuery)
    // Output: key1=value1&key2=value21&key2=value22&key3=333
    

    提交数据

    • form 表单
    cli := goz.NewClient()
    
    resp, err := cli.Post("http://127.0.0.1:8091/post-with-form-params", goz.Options{
        Headers: map[string]interface{}{
            "Content-Type": "application/x-www-form-urlencoded",
        },
        FormParams: map[string]interface{}{
            "key1": "value1",
            "key2": []string{"value21", "value22"},
            "key3": "333",
        },
    })
    if err != nil {
        log.Fatalln(err)
    }
    
    body, _ := resp.GetBody()
    fmt.Println(body)
    // Output: form params:{"key1":["value1"],"key2":["value21","value22"],"key3":["333"]}
    
    • json 数据
    cli := goz.NewClient()
    
    resp, err := cli.Post("http://127.0.0.1:8091/post-with-json", goz.Options{
        Headers: map[string]interface{}{
            "Content-Type": "application/json",
        },
        JSON: struct {
            Key1 string   `json:"key1"`
            Key2 []string `json:"key2"`
            Key3 int      `json:"key3"`
        }{"value1", []string{"value21", "value22"}, 333},
    })
    if err != nil {
        log.Fatalln(err)
    }
    
    body, _ := resp.GetBody()
    fmt.Println(body)
    // Output: json:{"key1":"value1","key2":["value21","value22"],"key3":333}
    

    请求头

    cli := goz.NewClient()
    
    resp, err := cli.Post("http://127.0.0.1:8091/post-with-headers", goz.Options{
        Headers: map[string]interface{}{
            "User-Agent": "testing/1.0",
            "Accept":     "application/json",
            "X-Foo":      []string{"Bar", "Baz"},
        },
    })
    if err != nil {
        log.Fatalln(err)
    }
    
    headers := resp.GetRequest().Header["X-Foo"]
    fmt.Println(headers)
    // Output: [Bar Baz]
    

    响应

    cli := goz.NewClient()
    resp, err := cli.Get("http://127.0.0.1:8091/get")
    if err != nil {
        log.Fatalln(err)
    }
    
    body, err := resp.GetBody()
    if err != nil {
        log.Fatalln(err)
    }
    fmt.Printf("%T", body)
    // Output: goz.ResponseBody
    
    part := body.Read(30)
    fmt.Printf("%T", part)
    // Output: []uint8
    
    contents := body.GetContents()
    fmt.Printf("%T", contents)
    // Output: string
    
    fmt.Println(resp.GetStatusCode())
    // Output: 200
    
    fmt.Println(resp.GetReasonPhrase())
    // Output: OK
    
    headers := resp.GetHeaders()
    fmt.Printf("%T", headers)
    // Output: map[string][]string
    
    flag := resp.HasHeader("Content-Type")
    fmt.Printf("%T", flag)
    // Output: bool
    
    header := resp.GetHeader("content-type")
    fmt.Printf("%T", header)
    // Output: []string
        
    headerLine := resp.GetHeaderLine("content-type")
    fmt.Printf("%T", headerLine)
    // Output: string
    

    代理

    cli := goz.NewClient()
    
    resp, err := cli.Get("https://www.fbisb.com/ip.php", goz.Options{
        Timeout: 5.0,
        Proxy:   "http://127.0.0.1:1087",
    })
    if err != nil {
        log.Fatalln(err)
    }
    
    fmt.Println(resp.GetStatusCode())
    // Output: 200
    

    超时

    cli := goz.NewClient(goz.Options{
        Timeout: 0.9,
    })
    resp, err := cli.Get("http://127.0.0.1:8091/get-timeout")
    if err != nil {
        if resp.IsTimeout() {
            fmt.Println("timeout")
            // Output: timeout
            return
        }
    }
    
    fmt.Println("not timeout")
    

    项目信息

    2 条回复    2020-02-16 12:22:36 +08:00
    runningman
        1
    runningman  
       2020-02-16 12:00:54 +08:00 via Android
    看着不错 咋没人顶
    tt67wq
        2
    tt67wq  
       2020-02-16 12:22:36 +08:00   ❤️ 1
    这个项目念 ”狗子“?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   808 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 740ms · UTC 20:19 · PVG 04:19 · LAX 13:19 · JFK 16:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.