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切换相关推荐

  1. conan入门(二十):封装只包含头文件(header_only)的库示例

    conan: 封装只包含头文件(header_only)的库示例 有的C/C++项目只包含头文件,不需要编译,对于这种情况如何封装为Conan的包呢? Conan官方文档 <Package sc ...

  2. 一个http请求的详细过程

    目录 整个流程 URL解析 DNS解析 与服务器建立连接(发起TCP的3次握手) 与下面的几层 TCP层 网络层 链路层 物理层 浏览器给WEB服务器发送一个HTTP请求 请求行 请求头部 请求数据 ...

  3. Jmeter基础系列4-创建一个HTTP请求实例

    在前面的章节我们介绍了软件的图形化界面的认识,还有元件的简单介绍,现在我们就可以开启创建第一个Jmeter测试用例吧. 1.新建一个Test Plan,保存之后左侧的测试计划的名称就会变成新的. 2. ...

  4. 一个简单的http请求,包含哪些内容

    什么叫做http请求?http请求可以实现什么样的功能?http请求里面包含什么东西呢?http请求如何被服务器解析?如果说你都明白了,那这篇文章对你的意义就不大了,请手下留情,勿喷.好了,下面我们共 ...

  5. iOS安全之二次封装AFN并设置请求头/执行HTTPS加强安全

    以前都是直接复制粘贴二次封装好的代码 , 现在都忘了怎么写 . 恰好当前项目要用到请求头 , 在网上学习了一下 , 统一敲了一遍 .自从到了现在公司 , 才发现要学的东西太多了 , 当然 , 有个好的 ...

  6. Android入门:封装一个HTTP请求的辅助类

    前面的文章中,我们曾经实现了一个HTTP的GET 和 POST 请求: 此处我封装了一个HTTP的get和post的辅助类,能够更好的使用: 类名:HttpRequestUtil 提供了如下功能: ( ...

  7. uni app 调用网络打印机_uni-app封装一个request请求

    在上一篇文章里面,写到使用uni.request请求的方法https://www.jianshu.com/p/bc62c9e1beed getList() { uni.request({url: &q ...

  8. python封装一个requests请求

    python封装一个requests请求 更新:https://blog.csdn.net/qq_42846555/article/details/126401051 from requests im ...

  9. Android:面试官死亡问答,如何优化一个网络请求?大牛多个网络优化方案帮你解决!

    面试官:小萧啊,我好想你啊,你都好久没来找我面试了呀. 小萧:emmmmmmm,这不是怕被你打击吗. 面试官:ok,看来是有备而来,那么我们今天聊聊网络优化咋做吧. 小萧:我大意了,没有闪.老头子,你 ...

最新文章

  1. Java项目:仿小米电子产品售卖商城系统(java+SpringBoot+Vue+MySQL+Redis+ElementUI)
  2. 某程序员为让公司裁掉自己,消极怠工!故意旷工!但公司坚持不裁他,领导:给你发工资,就是不裁你!...
  3. Flink + Iceberg 在去哪儿的实时数仓实践
  4. 模式8--WorkerThread
  5. android 渠道方案,Android多渠道打包时获取当前渠道的方法
  6. 搜索引擎蜘蛛及网站robots.txt文件详解[转载]
  7. 适用于中小型公司代理服务器的IPTABLES脚本
  8. 使用C/C++编程控制LEGO EV3
  9. (20200108)matlab弹出对话框形式打开和读取指定文件,不用提前输入文件名——uigetfile
  10. 华为校园招聘面试题目及流程
  11. 增量式光电编码器原理及其结构
  12. 自动化缺陷检测系统---项目总览
  13. 西安交通大学轴承公共数据集(文末附数据)
  14. 细菌大盘点(二) | 葡萄球菌、沙门氏菌、弯曲杆菌
  15. 假如我年少有为不自卑
  16. MCE公司:药研发的守护天使-MCE化合物库之先导篇
  17. 人工智能------>第一天,人工智能简介,机器学习简介,Numpy
  18. 全息图像恢复成物象matlab,计算全息再现图像.ppt
  19. DevExpress VCL 一键安装工具
  20. Codeforces 102202D-A Plus Equals B【思维】 难度:**

热门文章

  1. Vue 实现图片在循环中 默认 和 选中 之间的点击切换
  2. linux 2.6 添加系统调用,在Fedora 13里编译内核(linux-2.6.36)+添加系统调用
  3. 餐饮外卖平台小程序 v1.0.1
  4. 百度测试新搜索结果页面 改进灵感来自谷歌?
  5. PHP 加密用户密码 How to store passwords safely with PHP and MySQL
  6. 微信扫码登录网页实现原理
  7. html5游戏制作入门系列教程(二)
  8. html5拖拽图片批量ajax无刷新进度上传
  9. 正则表达式 去除连续空白 + 获取url +分割url + 获取图片
  10. 华中科大10年计算机考研复试机试