博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go的net/http用法
阅读量:5285 次
发布时间:2019-06-14

本文共 3636 字,大约阅读时间需要 12 分钟。

http包提供了HTTP客户端和服务端的实现

一:http客户端的几种方法

1、 func (c *Client) Get(url string) (resp *Response, err error)

说明: 利用get方法请求指定的url,Get请求指定的页面信息,并返回实体主体

2、func (c *Client) Head(url string) (resp *Response, err error)

说明:利用head方法请求指定的url,Head只返回页面的首部

3、func (c *Client) Post(url string, bodyType string, body io.Reader) (resp *Response, err error)

说明:利用post方法请求指定的URl,如果body也是一个io.Closer,则在请求之后关闭它

4、func (c *Client) PostForm(url string, data url.Values) (resp *Response, err error)

说明:利用post方法请求指定的url,利用data的key和value作为请求体.

5、func (c *Client) Do(req *Request) (resp *Response, err error)

说明:Do发送http请求并且返回一个http响应,遵守client的策略,如重定向,cookies以及auth等.当调用者读完resp.body之后应该关闭它,

如果resp.body没有关闭,则Client底层RoundTripper将无法重用存在的TCP连接去服务接下来的请求,如果resp.body非nil,则必须对其进行关闭.

通常来说,经常使用Get,Post,或者PostForm来替代Do

代码示例

1、http.Get

package mainimport (    "fmt"    "io/ioutil"    "net/http")func main() {    requestUrl := "http://www.baidu.com"    response, err := http.Get(requestUrl)    if err != nil {        fmt.Println(err)    }    defer response.Body.Close()    body, _ := ioutil.ReadAll(response.Body)    fmt.Println(string(body))}

2、http.Post

package mainimport (    "bytes"    "fmt"    "io/ioutil"    "net/http"    "net/url")func main() {    requestUrl := "http://www.baidu.com/"    // request, err := http.Get(requestUrl)    // request, err := http.Head(requestUrl)    postValue := url.Values{        "username": {
"hangmeimei"}, "address": {
"anhui"}, "subject": {
"world"}, "form": {
"beij"}, } //request, err := http.PostForm(requestUrl, postValue) body := bytes.NewBufferString(postValue.Encode()) request, err := http.Post(requestUrl, "text/html", body) if err != nil { fmt.Println(err) } defer request.Body.Close() fmt.Println(request.StatusCode) if request.StatusCode == 200 { rb, err := ioutil.ReadAll(request.Body) if err != nil { fmt.Println(rb) } fmt.Println(string(rb)) }}

3、 http.Do

package mainimport (    "fmt"    "io/ioutil"    "net/http"    "strconv")func main() {    client := &http.Client{}    request, err := http.NewRequest("GET", "http://www.baidu.com", nil)    if err != nil {        fmt.Println(err)    }    cookie := &http.Cookie{Name: "Tom", Value: strconv.Itoa(123)}    request.AddCookie(cookie) //向request中添加cookie    //设置request的header    request.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")    request.Header.Set("Accept-Charset", "GBK,utf-8;q=0.7,*;q=0.3")    request.Header.Set("Accept-Encoding", "gzip,deflate,sdch")    request.Header.Set("Accept-Language", "zh-CN,zh;q=0.8")    request.Header.Set("Cache-Control", "max-age=0")    request.Header.Set("Connection", "keep-alive")    response, err := client.Do(request)    if err != nil {        fmt.Println(err)        return    }    defer response.Body.Close()    fmt.Println(response.StatusCode)    if response.StatusCode == 200 {        r, err := ioutil.ReadAll(response.Body)        if err != nil {            fmt.Println(err)        }        fmt.Println(string(r))    }}

 

二:建立web服务器

package mainimport (    "net/http")func SayHello(w http.ResponseWriter, req *http.Request) {    w.Write([]byte("Hello"))}func main() {    http.HandleFunc("/hello", SayHello)    http.ListenAndServe(":8080", nil)}

说明:

首先调用Http.HandleFunc
往DefaultServeMux的map[string]muxEntry中增加对应的handler和路由规则

http.ListenAndServe

启动一个http服务器,监听8080端口
上面的代码中蕴含着http服务器处理http的流程,有时间可以看源码分析分析

 

参考:

https://www.cnblogs.com/msnsj/p/4365186.html

http://www.infoq.com/cn/articles/golang-standard-library-part02

 

转载于:https://www.cnblogs.com/jiujuan/p/9363571.html

你可能感兴趣的文章
LeetCode: Anagrams 解题报告
查看>>
Qt 中获取本机IP地址
查看>>
070102_赌博设计:概率的基本概念,古典概型
查看>>
IT人生的价值和意义 感觉真的有了
查看>>
JS DOM对象
查看>>
OGR – Merging Multiple SHP files
查看>>
创业公司该不该被收购?(转)
查看>>
sqlserver 行转列、列转行[转]
查看>>
【IScroll深入学习】解决IScroll疑难杂症
查看>>
python 数据类型
查看>>
108-PHP类成员protected和private成员属性不能被查看数值
查看>>
css控制height充满浏览器视口
查看>>
python学习之 - XML
查看>>
Laravel学习笔记(三)数据库 数据库迁移
查看>>
Python--GIL 详解
查看>>
Oracle数据导入Mysql中
查看>>
大道至简读后感(第四章)
查看>>
IDA IDC Tutorials: Additional Auto-Commenting
查看>>
k8s-存储卷1-十二
查看>>
在Android中Intent的概念及应用(二)——Intent过滤器相关选项
查看>>