封装的一个http请求struct,包含:头、cookie、代理、超时、本地ip切换
2019独角兽企业重金招聘Python工程师标准>>>
package httpimport ("net""net/http""net/url""time""errors""strings"
)var headerUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36"type Httpx struct {Url stringHeaders map[string] stringCookies []*http.CookieClientIP string //本机外网IP,可选Method stringProxyUrl string //代理URLPostData url.ValuesTimeout int //超时时间,秒
}func NewHttpx(reqUrl string) (h *Httpx) {headers := make(map[string] string)headers["User-Agent"] = headerUserAgentreturn &Httpx{Url : reqUrl,Headers : headers,Method : "GET",Timeout : 30,}
}//添加header
func (h *Httpx)AddHeader(key, value string) {h.Headers[key] = value
}//添加cookie
func (h *Httpx)AddCookie(c *http.Cookie) {h.Cookies = append(h.Cookies, c)
}//添加POST值
func (h *Httpx)AddPostValue(key string, values []string) {if h.PostData == nil {h.PostData = make(url.Values)}if values != nil {for _, v := range values {h.PostData.Add(key, v)}}
}//发送请求
func (h *Httpx)Send() (response *http.Response, err error) {if h.Url == "" {return nil, errors.New("URL is empty")}defer func(){if err != nil && h.ClientIP != "" {err = errors.New(err.Error() + " client ip is "+h.ClientIP)}}()var req *http.Requestif h.Method == "POST" {req, _ = http.NewRequest("POST", h.Url, strings.NewReader(h.PostData.Encode()))req.Header.Set("Content-Type", "application/x-www-form-urlencoded")}else{req, _ = http.NewRequest(h.Method, h.Url, nil)}//headersif len(h.Headers) >0 {for k, v := range h.Headers {req.Header.Set(k, v)}}//cookiesif len(h.Cookies) > 0 {for _, v := range h.Cookies {req.AddCookie(v)}}transport := &http.Transport{}//是否使用代理if h.ProxyUrl != "" {proxy, err := url.Parse(h.ProxyUrl)if err != nil {return nil, err}transport.Proxy = http.ProxyURL(proxy)}//设置超时时间dialer := net.Dialer{Timeout : time.Duration(h.Timeout) * time.Second,Deadline : time.Now().Add(time.Duration(h.Timeout) * time.Second),}//是否使用指定的IP发送请求if h.ClientIP != "" {transport.Dial = func(network, address string) (net.Conn, error) {//本地地址 本地外网IPlAddr, err := net.ResolveTCPAddr(network, h.ClientIP+":0")if err != nil {return nil, err}dialer.LocalAddr = lAddrreturn dialer.Dial(network, address)}}else {transport.Dial = func(network, address string) (net.Conn, error) {return dialer.Dial(network, address)}}client := &http.Client{Transport: transport,}response, err = client.Do(req)return response, err}
// GET请求
func HttpGet(reqUrl string) (*http.Response, error) {hx := NewHttpx(reqUrl)return hx.Send()
}//利用指定的IP发送请求
func HttpGetFromIP(reqUrl, ipaddr string) (*http.Response, error) {hx := NewHttpx(reqUrl)hx.ClientIP = ipaddrreturn hx.Send()
}// http GET 代理
func HttpGetFromProxy(reqUrl, proxyURL string) (*http.Response, error) {hx := NewHttpx(reqUrl)hx.ProxyUrl = proxyURLreturn hx.Send()
}//POST请求
func HttpPost(reqUrl string, postValues map[string] []string) (*http.Response, error) {hx := NewHttpx(reqUrl)hx.Method = "POST"if postValues != nil {for k, v := range postValues {hx.AddPostValue(k, v)}}return hx.Send()
}
转载于:https://my.oschina.net/mejinke/blog/145900
封装的一个http请求struct,包含:头、cookie、代理、超时、本地ip切换相关推荐
- conan入门(二十):封装只包含头文件(header_only)的库示例
conan: 封装只包含头文件(header_only)的库示例 有的C/C++项目只包含头文件,不需要编译,对于这种情况如何封装为Conan的包呢? Conan官方文档 <Package sc ...
- 一个http请求的详细过程
目录 整个流程 URL解析 DNS解析 与服务器建立连接(发起TCP的3次握手) 与下面的几层 TCP层 网络层 链路层 物理层 浏览器给WEB服务器发送一个HTTP请求 请求行 请求头部 请求数据 ...
- Jmeter基础系列4-创建一个HTTP请求实例
在前面的章节我们介绍了软件的图形化界面的认识,还有元件的简单介绍,现在我们就可以开启创建第一个Jmeter测试用例吧. 1.新建一个Test Plan,保存之后左侧的测试计划的名称就会变成新的. 2. ...
- 一个简单的http请求,包含哪些内容
什么叫做http请求?http请求可以实现什么样的功能?http请求里面包含什么东西呢?http请求如何被服务器解析?如果说你都明白了,那这篇文章对你的意义就不大了,请手下留情,勿喷.好了,下面我们共 ...
- iOS安全之二次封装AFN并设置请求头/执行HTTPS加强安全
以前都是直接复制粘贴二次封装好的代码 , 现在都忘了怎么写 . 恰好当前项目要用到请求头 , 在网上学习了一下 , 统一敲了一遍 .自从到了现在公司 , 才发现要学的东西太多了 , 当然 , 有个好的 ...
- Android入门:封装一个HTTP请求的辅助类
前面的文章中,我们曾经实现了一个HTTP的GET 和 POST 请求: 此处我封装了一个HTTP的get和post的辅助类,能够更好的使用: 类名:HttpRequestUtil 提供了如下功能: ( ...
- uni app 调用网络打印机_uni-app封装一个request请求
在上一篇文章里面,写到使用uni.request请求的方法https://www.jianshu.com/p/bc62c9e1beed getList() { uni.request({url: &q ...
- python封装一个requests请求
python封装一个requests请求 更新:https://blog.csdn.net/qq_42846555/article/details/126401051 from requests im ...
- Android:面试官死亡问答,如何优化一个网络请求?大牛多个网络优化方案帮你解决!
面试官:小萧啊,我好想你啊,你都好久没来找我面试了呀. 小萧:emmmmmmm,这不是怕被你打击吗. 面试官:ok,看来是有备而来,那么我们今天聊聊网络优化咋做吧. 小萧:我大意了,没有闪.老头子,你 ...
最新文章
- Java项目:仿小米电子产品售卖商城系统(java+SpringBoot+Vue+MySQL+Redis+ElementUI)
- 某程序员为让公司裁掉自己,消极怠工!故意旷工!但公司坚持不裁他,领导:给你发工资,就是不裁你!...
- Flink + Iceberg 在去哪儿的实时数仓实践
- 模式8--WorkerThread
- android 渠道方案,Android多渠道打包时获取当前渠道的方法
- 搜索引擎蜘蛛及网站robots.txt文件详解[转载]
- 适用于中小型公司代理服务器的IPTABLES脚本
- 使用C/C++编程控制LEGO EV3
- (20200108)matlab弹出对话框形式打开和读取指定文件,不用提前输入文件名——uigetfile
- 华为校园招聘面试题目及流程
- 增量式光电编码器原理及其结构
- 自动化缺陷检测系统---项目总览
- 西安交通大学轴承公共数据集(文末附数据)
- 细菌大盘点(二) | 葡萄球菌、沙门氏菌、弯曲杆菌
- 假如我年少有为不自卑
- MCE公司:药研发的守护天使-MCE化合物库之先导篇
- 人工智能------>第一天,人工智能简介,机器学习简介,Numpy
- 全息图像恢复成物象matlab,计算全息再现图像.ppt
- DevExpress VCL 一键安装工具
- Codeforces 102202D-A Plus Equals B【思维】 难度:**
热门文章
- Vue 实现图片在循环中 默认 和 选中 之间的点击切换
- linux 2.6 添加系统调用,在Fedora 13里编译内核(linux-2.6.36)+添加系统调用
- 餐饮外卖平台小程序 v1.0.1
- 百度测试新搜索结果页面 改进灵感来自谷歌?
- PHP 加密用户密码 How to store passwords safely with PHP and MySQL
- 微信扫码登录网页实现原理
- html5游戏制作入门系列教程(二)
- html5拖拽图片批量ajax无刷新进度上传
- 正则表达式 去除连续空白 + 获取url +分割url + 获取图片
- 华中科大10年计算机考研复试机试