golang之net/http包简单的get/post请求

aside section ._1OhGeD · · 12746 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

1.get请求

  • http.Get
package main

import (
    "fmt"
    "net/http"
)


func main() {
    resp, err := http.Get("https://wwww.baidu.com")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(resp.StatusCode)
}

2.post请求

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    data := url.Values{"app_id":{"238b2213-a8ca-42d8-8eab-1f1db3c50ed6"}, "mobile_tel":{"13794227450"}}
    body := strings.NewReader(data.Encode())
    urlStr := "http://qdgj.myscrm.cn/api/index.php?r=site/login&token=cdkqqf1407307954&from=b2c_h5"
    resp, err := http.Post(urlStr, "application/x-www-form-urlencoded", body)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer resp.Body.Close()
    bodyC, _ := ioutil.ReadAll(resp.Body)

    var jsonMap map[string]interface{}
    err = json.Unmarshal(bodyC, &jsonMap)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(jsonMap)
}

这里用ioutil.ReadAll(resp.Body)来读取响应
我自己本地的测试接口返回信息如下:

map[app_id:238b2213-a8ca-42d8-8eab-1f1db3c50ed6 mobile_tel:13794227450]

3.细节

首先,直接用http.get或http.post,用的都是DefaultClient来调用get/post:


image.png

image.png

由此可见,我们可用client来调用,比如:

package main

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

func main() {
    client := http.Client{
        Timeout: 5* time.Second,
    }
    resp, err := client.Get("http://qdgj.myscrm.cn/api/index.php?r=site/login&token=cdkqqf1407307954&from=b2c_h5")
    if err != nil {
        fmt.Println(err)
        return
    }
    html,_ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(html))
}

上述代码还给client设置了超时时间,我将测试接口休眠6s,得到输出:

Get http://qdgj.myscrm.cn/api/index.php?r=site/login&token=cdkqqf1407307954&from=b2c_h5:
 net/http: request canceled (Client.Timeout exceeded while awaiting headers)

继续看源码,无论get还是post都是用这种方式来创建请求:


image.png
image.png

因此,你也可以用这种方式来创建请求,比如:

package main

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

func main() {
    var body io.Reader
    req, err := http.NewRequest("GET", "http://qdgj.myscrm.cn/api/index.php?r=site/login&token=cdkqqf1407307954&from=b2c_h5", body)
    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        fmt.Println(err)
        return
    }
    html,_ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(html))
}

另外,我们再看看request和response有哪些结构体成员:

  • request
type Request struct {
    Method string  //HTTP method (GET, POST, PUT, etc.)
    URL *url.URL // 见下面URL定义
    Proto      string // http协议类型,如 HTTP/1.1,HTTP/2
    ProtoMajor int    // 1
    ProtoMinor int    // 0
    Header Header // 请求头,map[string][]string
    Body io.ReadCloser // http请求body post请求的内容就放在这里
    GetBody func() (io.ReadCloser, error) // 获取body的方法
    ContentLength int64  // 描述HTTP消息实体的传输长度
    TransferEncoding []string  //传输编码, 如chunk
    Close bool 
    Host string // 主机地址,IP或域名
    Form url.Values //URL和参数的map
    PostForm url.Values //POST, PATCH, or PUT body 参数
    MultipartForm *multipart.Form
    Trailer Header
    RemoteAddr string
    RequestURI string //通常就是URL
    TLS *tls.ConnectionState
    Cancel <-chan struct{}
    Response *Response
    ctx context.Context
}

----------------------------------------------
URL定义:
type URL struct {
    Scheme     string
    Opaque     string    // encoded opaque data
    User       *Userinfo // username and password information
    Host       string    // host or host:port
    Path       string    // path (relative paths may omit leading slash)
    RawPath    string    // encoded path hint (see EscapedPath method)
    ForceQuery bool      // append a query ('?') even if RawQuery is empty
    RawQuery   string    // encoded query values, without '?'
    Fragment   string    // fragment for references, without '#'
}
  • response
type Response struct {
    Status     string // e.g. "200 OK"
    StatusCode int    // e.g. 200
    Proto      string // e.g. "HTTP/1.0"
    ProtoMajor int    // e.g. 1
    ProtoMinor int    // e.g. 0
        Header Header //响应头
    Body io.ReadCloser //响应内容
    ContentLength int64 //HTTP消息实体的传输长度
    TransferEncoding []string 
    Close bool
    Uncompressed bool
    Trailer Header
    Request *Request
    TLS *tls.ConnectionState
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:aside section ._1OhGeD

查看原文:golang之net/http包简单的get/post请求

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

12746 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传