zoukankan      html  css  js  c++  java
  • 【Golang 接口自动化01】使用标准库net/http发送Get请求

    发送Get请求

    使用Golang发送get请求很容易,我们还是使用http://httpbin.org作为服务端来进行演示。

    package main
    
    import (
    	"bytes"
    	"fmt"
    	"log"
    	"net/http"
    	"net/url"
    	"reflect"
    )
    
    func main() {
    	resp, err := http.Get("http://httpbin.org/get?name=Detector")
    
    	if err != nil {
    		log.Println(err)
    		return
    	}
    
    	defer resp.Body.Close()
    
    	headers := resp.Header
    	// headers 打印报文头部信息
    	for k, v := range headers {
    		fmt.Printf("%v, %v
    ", k, v) // %v 打印interfac{}的值
    	}
    
    	// 打印响应信息内容
    	fmt.Printf("响应状态:%s,响应码: %d
    ", resp.Status, resp.StatusCode)
    	fmt.Printf("协议:%s
    ", resp.Proto)
    	fmt.Printf("响应内容长度: %d
    ", resp.ContentLength)
    	fmt.Printf("编码格式:%v
    ", resp.TransferEncoding) // 未指定时为空
    	fmt.Printf("是否压缩:%t
    ", resp.Uncompressed)
    	fmt.Println(reflect.TypeOf(resp.Body)) // *http.gzipReader
    	fmt.Println(resp.Close)
    
    	buf := bytes.NewBuffer(make([]byte, 0, 512))
    	length, _ := buf.ReadFrom(resp.Body)
    	fmt.Println(len(buf.Bytes()))
    	fmt.Println(length)
    	fmt.Println(string(buf.Bytes()))
    }
    

    响应信息

    λ go run goHttp.go
    Access-Control-Allow-Credentials, [true]
    Via, [1.1 vegur]
    Connection, [keep-alive]
    Server, [gunicorn/19.9.0]
    Date, [Tue, 18 Sep 2018 02:25:16 GMT]
    Content-Type, [application/json]
    Content-Length, [271]
    Access-Control-Allow-Origin, [*]
    "响应状态":200 OK,响应码: 200
    "协议":HTTP/1.1
    "响应内容长度": 271
    "编码格式":[]
    "是否压缩":false
    *http.bodyEOFSignal
    false
    271
    271
    {
      "args": {
        "name": "Detector"
      },
      "headers": {
        "Accept-Encoding": "gzip",
        "Connection": "close",
        "Host": "httpbin.org",
        "User-Agent": "Go-http-client/1.1"
      },
      "origin": "14.152.49.250",
      "url": "http://httpbin.org/get?name=Detector"
    }
    

    更多的响应内容我们查看安装路径的net包中Response struct 的信息,里面有详细的注释,参考路径:C:Gosrc ethttp esponse.go:

    拓展

    用过Python的同学都知道,Python的requests发送get请求时是可以直接传递字典的(dict/map)的,比如:

    #! /usr/bin/python
    import requests
    
    a = {"name": "bingo", "age": "18", "location": "shenzhen"}
    
    name = {"name": "Detector"}
    resp = requests.get("http://httpbin.org/get", params=a)
    print(resp.text)
    

    响应信息:

    {
      "args": {
        "age": "18", 
        "location": "shenzhen", 
        "name": "bingo"
      }, 
      "headers": {
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Connection": "close", 
        "Host": "httpbin.org", 
        "User-Agent": "python-requests/2.18.4"
      }, 
      "origin": "14.152.49.250", 
      "url": "http://httpbin.org/get?name=bingo&age=18&location=shenzhen"
    }
    

    那么在golang中有没有想过的方法呢,答案是有的,但是只有一个半成品。

    C:Gosrc eturlurl.go中我们可以看到一个结构体type Values map[string][]string,他有一个Encode()方法可以把key:value键值对转化为key=value&key=value的形式:

    package main
    
    import (
    	"fmt"
    	"io/ioutil"
    	"log"
    	"net/http"
    	"net/url"
    )
    
    func main() {
    	name := url.Values{"name": {"bingo"}, "age": {"18"}, "local": {"shenzhen"}}
    	param := name.Encode()
    	url := fmt.Sprintf("http://httpbin.org/get?%s", param)
    	fmt.Println(url)
    
    	resp, err := http.Get(url)
    
    	if err != nil {
    		log.Println(err)
    		return
    	}
    	defer resp.Body.Close()
    	body, err := ioutil.ReadAll(resp.Body)
    	fmt.Println(string(body))
    }
    

    输出:

    http://httpbin.org/get?age=18&local=shenzhen&name=bingo
    {
      "args": {
        "age": "18", 
        "local": "shenzhen", 
        "name": "bingo"
      }, 
      "headers": {
        "Accept-Encoding": "gzip", 
        "Connection": "close", 
        "Host": "httpbin.org", 
        "User-Agent": "Go-http-client/1.1"
      }, 
      "origin": "103.84.19.17", 
      "url": "http://httpbin.org/get?age=18&local=shenzhen&name=bingo"
    }
    

    考虑到篇幅,我们把发送Get、Post单独出来。我们在下一篇一起学习怎么发送Post请求。

  • 相关阅读:
    Android -- DiskLruCache
    Android -- EventBus解析
    Android -- Annotation
    Ubuntu 1604 安装配置 kafka,并配置开机自启(systemctl)
    zookeeper/kafka的部署
    pdf 中内容的坐标系
    C# 获取Windows 设备信息
    C#读取Word指定页的内容
    再看C# ThreadPool与Task的认识总结
    同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别
  • 原文地址:https://www.cnblogs.com/Detector/p/9581850.html
Copyright © 2011-2022 走看看