Golang提供了官方的http包,对于http操作非常的方便和简洁。
但是不同于PHP,使用Golang的包来做http操作,还是没有那么”直接“,需要实例化一下这个,实例化一下那个,有点像Java,因此,为了以后书写方便,就把基本的请求写在此。下次用的时候,直接copy就好了。

get 请求

get请求有好几种方式

直接使用net/http包内的函数请求

import "net/http"
...
resp, err := http.Get("http://wwww.baidu.com")

利用http.client结构体来请求

import "net/http"
...
clt := http.Client{}
resp, err := clt.Get("http://wwww.baidu.com")

最本质的请求方式

如果稍微看一下源码,就会发现以上两种方式都是用了一下这种最本质的请求方式,使用http.NewRequest函数

req, err := http.NewRequest("GET", "http://www.baidu.com", nil)//然后http.client 结构体的 Do 方法
//http.DefaultClient可以换为另外一个http.client
resp, err := http.DefaultClient.Do(req)

Go的get请求面上有好几种请求方式,实则只有一种:

1、使用http.NewRequest函数获得request实体

2、利用http.client结构体的Do方法,将request实体传入Do方法中。

post请求

和get请求类似,post请求也有多种方法,但本质还是使用了http.NewRequest函数和http.clientDo方法。

使用net/http包带的post方法

import (
"net/http"
"net/url"
)
...
data := url.Values{"start":{"0"}, "offset":{"xxxx"}}
body := strings.NewReader(data.Encode())
resp, err := http.Post("xxxxxxx", "application/x-www-form-urlencoded", body)

或者还可以

import (
"net/http"
"net/url"
)
...
var r http.Request
r.ParseForm()
r.Form.Add("xxx", "xxx")
body := strings.NewReader(r.Form.Encode())
http.Post("xxxx", "application/x-www-form-urlencoded", body)

要是还是觉得复杂,还可以:

import (
"net/http"
"net/url"
)
...
data := url.Values{"start":{"0"}, "offset":{"xxxx"}}
http.PostForm("xxxx", data)

使用实例化的http client的post方法

其实本质上直接使用包的函数和实例化的http client是一样的,包的函数底层也仅仅是实例化了一个DefaultClient,然后调用的DefaultClient的方法。下面给出使用实例化的http client的post方法:

import (
"net/http"
"net/url"
)
...
data := url.Values{"start":{"0"}, "offset":{"xxxx"}}
body := strings.NewReader(data.Encode())
clt := http.Client{}
resp, err := clt.Post("xxxxxxx", "application/x-www-form-urlencoded", body)

还有

import (
"net/http"
"net/url"
)
...
var r http.Request
r.ParseForm()
r.Form.Add("xxx", "xxx")
body := strings.NewReader(r.Form.Encode())
clt := http.Client{}
clt.Post("xxxx", "application/x-www-form-urlencoded", body)

简单的,但仅限于form表单

import (
"net/http"
"net/url"
)
...
data := url.Values{"start":{"0"}, "offset":{"xxxx"}}
clt := http.Client{}
clt.PostForm("xxxx", data)

使用net/http包的NewRequest函数

其实不管是get方法也好,post方法也好,所有的get、post的的http 请求形式,最终都是会调用net/http包的NewRequest函数,多种多样的请求形式,也仅仅是封装的不同而已。

import (
"net/http"
"net/url"
)
...data := url.Values{"start":{"0"}, "offset":{"xxxx"}}
body := strings.NewReader(data.Encode())req, err := http.NewRequest("POST", "xxxxx", body)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")clt := http.Client{}
clt.Do(req)

添加request header

net/http包没有封装直接使用请求带header的get或者post方法,所以,要想请求中带header,只能使用NewRequest方法。

import (
"net/http")
...req, err := http.NewRequest("POST", "xxxxx", body)
//此处还可以写req.Header.Set("User-Agent", "myClient")
req.Header.Add("User-Agent", "myClient")clt := http.Client{}
clt.Do(req)

有一点需要注意:在添加header操作的时候,req.Header.Addreq.Header.Set都可以,但是在修改操作的时候,只能使用req.Header.Set
这俩方法是有区别的,Golang底层Header的实现是一个map[string][]stringreq.Header.Set方法如果原来Header中没有值,那么是没问题的,如果又值,会将原来的值替换掉。而req.Header.Add的话,是在原来值的基础上,再append一个值,例如,原来header的值是“s”,我后req.Header.Add一个”a”的话,变成了[s a]。但是,获取header值的方法req.Header.Get确只取第一个,所以,如果原来有值,重新req.Header.Add一个新值的话,req.Header.Get得到的值不变。

打印response响应

Golang打印response没有PHP那么爽,哎,编译型语言就是麻烦。

import ("net/http""net/url""io/ioutil"
)
...
content, err := ioutil.ReadAll(resp.Body)
respBody := string(content)

使用cookie

Golang提供了cookie的包net/http/cookiejar

...url, err := url.Parse("https://www.wukong.com/")
jar, err := cookiejar.New(nil)
jar.SetCookies(url, cookies)//这里的cookies是[]*http.Cookie
wukongClt := http.Client{Transport:nil, Jar:jar}wukongClt.Get("xxxxx")

文中的cookies类型是[] *http.cookie可以自己实例化,有时候也可以从response中直接使用resp.Cookies()直接拿到。

Golang的cookie是和http.client联系在一起的,作为http.client的一个属性存在。因此,要想在Golang中使用cookie,就必须想办法构造http.client

使用代理

在Golang中使用http proxy,也必须构造自己的http.client,需要将http.client结构体的一个属性Transport自己实例化好。

当使用环境变量$http_proxy或$HTTP_PROXY作为代理时

//从环境变量$http_proxy或$HTTP_PROXY中获取HTTP代理地址
func GetTransportFromEnvironment() (transport *http.Transport) {transport = &http.Transport{Proxy : http.ProxyFromEnvironment}return
}

当使用自己搭建http代理时

参数proxy_addr即代理服务器IP端口号,例如:”http://xxx.xxx.xxx.xxx:6000“,注意,必须加上"http"

func GetTransportFieldURL(proxy_addr *string) (transport *http.Transport) {url_i := url.URL{}url_proxy, error := url_i.Parse(*proxy_addr)if error != nil{fmt.Println(error.Error())}transport = &http.Transport{Proxy : http.ProxyURL(url_proxy)}return
}

使用的时候,首先调用函数,拿到对应的transport,即使用GetTransportFieldURL或者GetTransportFieldURL函数,然后构建自定义的http.client :

ProxyUrl := "http://xxx.xxx.xxx.xxx:6000"
transport := GetTransportFieldURL(&ProxyUrl)
clt := http.Client{Transport:transport}clt.Get("http://www.baidu.com")

golang http 操作 简介相关推荐

  1. Go实战--golang中操作PDF(rsc.io/pdf、jung-kurt/gofpdf、signintech/gopdf)

    生命不止,继续 go go go !!! 昨天介绍了golang中如何操作excel: Go实战–golang中操作excel(tealeg/xlsx.360EntSecGroup-Skylar/ex ...

  2. python中常见的流程结构-Python分支结构(switch)操作简介

    Python当中并无switch语句,本文研究的主要是通过字典实现switch语句的功能,具体如下. switch语句用于编写多分支结构的程序,类似与if-.elif-.else语句. switch语 ...

  3. python分支switch_Python分支结构(switch)操作简介

    Python当中并无switch语句,本文研究的主要是通过字典实现switch语句的功能,具体如下. switch语句用于编写多分支结构的程序,类似与if-.elif-.else语句. switch语 ...

  4. python中分支结构包括哪些_Python分支结构(switch)操作简介

    Python当中并无switch语句,本文研究的主要是通过字典实现switch语句的功能,具体如下. switch语句用于编写多分支结构的程序,类似与if-.elif-.else语句. switch语 ...

  5. golang语言操作文件

    golang语言操作文件的示例 https://colobu.com/2016/10/12/go-file-operations/#more

  6. oracle kepserve,Kepware.KEPServer\KEPServerEX_V5操作简介含opc quick client 连接测试

    [实例简介] Kepware.KEPServer\KEPServerEX_V5操作简介含opc quick client 连接测试 3.開魯 KEPServereX的管理視窗 請從「開始」->「 ...

  7. 作业一:数据软件系统的介绍及spss的操作简介

        数据分析软件介绍     数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程.这一过程也是质量管理体系的支持过程.在实用中, ...

  8. JMeter入门操作简介

    JMeter入门操作简介 1.JMter简介及作用 JMter是Apache公司用Java开发的一款测试工具 接口测试.性能测试.数据库测试.java程序测试. 可以对服务器.网络或者对象模拟巨大的负 ...

  9. 大家一起学Golang——Go语言简介与安装

    大家一起学Golang --Go语言简介与安装 go语言简介 Go语言是有google公司推出的一门编程语言,是开源,静态编程语言,语法简洁,天生支持并发. 2007年由Robert Grieseme ...

最新文章

  1. Python 最强编辑器详细使用指南!
  2. iOS App与iTunes文件传输的方法和对iOS App文件结构的说明
  3. 关于JAVA中子类和父类的构造方法
  4. python输出列/行内容显示不全
  5. 【java设计模式之Command(菜单命令) 】
  6. swagger传递日期类型 json形式
  7. 【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP
  8. python之旅-day2(较基础阶段)
  9. iphone pageController 的实现
  10. java框架常见面试题_java框架面试题总结
  11. WEB应用程序的开发和研究
  12. TP6微信公众号登陆授权
  13. 一个app项目如何从想法一步一步落地?有哪些必要的流程?
  14. linux下查看硬盘型号、大小等信息(含Raid)
  15. 推荐 10 个实用但偏执的 Java 编程技巧
  16. ArcGIS问题:dbf shp shx sbn sbx mdb adf等类型的文件的解释
  17. Windows7 开机自启脚本
  18. 容器编排的作用和要实现的内容
  19. 植物大战僵尸CE教程
  20. Halcon形态学梯度

热门文章

  1. python找不到tushare_python tushare安装
  2. 2018年自主车企销量目标完成情况 这几家企业估计要凉
  3. 使用angular5+ionic3+sqlite创建离线app应用
  4. DataGridView控件60招(一)
  5. el表达式判断字符串相等
  6. 如何在linux下修改组权限
  7. loadrunner-4-3报告摘要
  8. 状态模式在领域驱动设计中的使用
  9. 时代中坚:互联网电视迎来极致时代
  10. sqoop配置与使用