Go语言之Golang http请求库HttpRequest[通俗易懂]

Go语言之Golang http请求库HttpRequest[通俗易懂]Go语言HttpRequest项目源码地址:https://github.com/kirinlabs/HttpRequest主要实现功能目录安装:发送请求传递URL参数响应内容Json响应内容定制请求头BasicAuth认证JSON请求Cookie超时关闭证书验证调试模式连接操作Respone对象实例代码具有快速构建…

大家好,又见面了,我是你们的朋友全栈君。

Go语言HttpRequest项目源码地址: https://github.com/kirinlabs/HttpRequest

主要实现功能

       支持常用的GET、POST、DELETE、PUT等

       GET 除了正常请求url,也可以附带”name=flyfreely&address=beijing”或者map[string]interface{} 两种参数,包会自动整合到QueryString中

       POST 支持string, []byte, *bytes.Reader, *bytes.Buffer, *strings.Reader, map[string]interface{}等参数; 如果发送JSON请求,几乎可以支持发送所有数据类型。

       支持自定义Transport

 

目录

安装:

发送请求

自定义Transport

传递URL参数

响应内容

Json响应内容

定制请求头

BasicAuth 认证

CookieJar

Proxy代理

JSON请求

超时   

关闭证书验证

调试模式

连接操作

Respone对象

实例代码



具有快速构建Headers、Cookies、设置超时时间、请求、耗时、打印请求信息等功能

安装:

go get https://github.com/kirinlabs/HttpRequest

发送请求

导入HttpRequest

import "github.com/kirinlabs/HttpRequest"

实例化:

req := HttpRequest.NewRequest()

然后,尝试获取某个网页。我们来获取 Github 的公共时间线

res,err := req.Get("https://api.github.com/events")

返回一个res的Response对象和err的Error对象

 

自定义Transport

var transport *http.Transport

func init() {   
    transport = &http.Transport{
        DialContext: (&net.Dialer{
            Timeout:   30 * time.Second,
            KeepAlive: 30 * time.Second,
            DualStack: true,
        }).DialContext,
        MaxIdleConns:          100, 
        IdleConnTimeout:       90 * time.Second,
        TLSHandshakeTimeout:   5 * time.Second,
        ExpectContinueTimeout: 1 * time.Second,
    }
}

func demo(){
    // Use http.DefaultTransport
    res, err := HttpRequest.Get("http://127.0.0.1:8080")

    // Use custom Transport
    res, err := HttpRequest.Transport(transport).Get("http://127.0.0.1:8080")
}

 

Post 请求

//无参请求
res,err := req.Post("https://www.baidu.com")

//发送整数类型
res,err := req.Post("https://www.baidu.com",uint32(100))

//发送[]byte
res,err := req.Post("https://www.baidu.com",[]byte("bytes data"))

//发送*bytes.Reader,*strings.Reader,*bytes.Buffer
data := bytes.NewReader(buf []byte)
res,err := req.Post("https://www.baidu.com",data)
res,err := req.Post("https://www.baidu.com",strings.NewReader("string data"))

//请求体为文本
res,err := req.Post("https://www.baidu.com","hello")


//请求体为Json字符串
res,err := req.Post("https://www.baidu.com","{\"name\":\"github\"}")


//map传参
res.err := req.Post("https://www.baidu.com",map[string]interface{}{
    "name":"github",
    "type":1,
})

 也可以不用实例化,直接发送请求

//快速发送Get请求
res,err := HttpRequest.Get("https://www.baidu.com")

res,err := HttpRequest.Get("https://www.baidu.com","title=baidu")


//快速发送Post请求
res,err := HttpRequest.Post("https://www.baidu.com")

//发送整数类型
res,err := req.Post("https://www.baidu.com",uint32(100))

//发送[]byte
res,err := req.Post("https://www.baidu.com",[]byte("bytes data"))

//发送*bytes.Reader,*strings.Reader,*bytes.Buffer
res,err := req.Post("https://www.baidu.com",bytes.NewReader(buf []byte))
res,err := req.Post("https://www.baidu.com",bytes.NewBuffer(buf []byte))
res,err := req.Post("https://www.baidu.com",strings.NewReader("string data"))


res,err := HttpRequest.Post("https://www.baidu.com","title=baidu&type=pdf")

res,err := HttpRequest.Post("https://www.baidu.com",map[string]interface{}{
    "title":"baidu",
})


//快速发送JSON请求
res,err := HttpRequest.JSON().Post("https://www.baidu.com",map[string]interface{}{
    "title":"baidu",
})

res,err := HttpRequest.JSON().Post("https://www.baidu.com",`{"title":"baidu","type":"pdf"}`)

传递URL参数

你想为URL的查询字符串(query string)传递数据。如:手工构建URL,http://www.baidu.com/index?key=value。HttpRequest允许你使用第2个参数以字符串”id=100&name=github”或map[string]interface{}{“id”:10,”name”:”github”}字典的形式把数据传递给URL:

手工传参:

res,err := req.Get("https://www.baidu.com/index?name=github")

字符串传参:

res,err := req.Get("https://www.baidu.com/index?name=github","id=100&type=1")

map传参:

res,err := req.Get("https://www.baidu.com/index?name=github",map[string]interface{}{
    "id":10,
    "type":1,
})

 

响应内容

能读取服务器响应的内容

res,err := req.Post("https://api.github.com/events")

 获取服务器返回的内容:

body,err := res.Body()

fmt.Println(string(body))

获取服务器响应状态码:

res.StatusCode()

获取服务器响应Headers:

res.Headers()

返回一个map[string]string的字典

获取请求响应时间:

res.Time()

Json响应内容

HttpRequest内置JSON解码,来解析JSON数据:

//Format the json return value
body, err := res.Json() 

fmt.Println(body)

如果JSON解码失败,会返回一个err错误

 

定制请求头

如果想为请求添加HTTP头部信息,只需要简单的传一个map给SetHeaders方法

req.SetHeaders(map[string]string{
    "Content-Type":"application/json",
    "Source":"api",
})

注:所有header值必须是字符串,SetHeaders可以多次调用,如果Key重复则会覆盖前面设置的值

 

BasicAuth 认证

如果想为请求添加HTTP头部信息,只需要简单的传一个map给SetHeaders方法

req.SetBasicAuth("username","password")

CookieJar

j, _ := cookiejar.New(nil)
j.SetCookies(&url.URL{
	Scheme: "http",
	Host:   "127.0.0.1:8000",
}, []*http.Cookie{
	&http.Cookie{Name: "identity-user", Value: "83df5154d0ed31d166f5c54ddc"},
	&http.Cookie{Name: "token_id", Value: "JSb99d0e7d809610186813583b4f802a37b99d"},
})
res, err := HttpRequest.Jar(j).Get("http://127.0.0.1:8000/city/list")
defer res.Close()
if err != nil {
	log.Fatalf("Request error:%v", err.Error())
}

Proxy代理

通过代理Ip访问

proxy, err := url.Parse("http://proxyip:proxyport")
if err != nil {
	log.Println(err)
}

res, err := HttpRequest.Proxy(http.ProxyURL(proxy)).Get("http://127.0.0.1:8000/ip")
defer res.Close()
if err != nil {
	log.Println("Request error:%v", err.Error())
}
body, err := res.Body()
if err != nil {
	log.Println("Get body error:%v", err.Error())
}
log.Println(string(body))

 

JSON请求

如果想以json方式发送请求,HttpRequest支持2种方式

设置Header头部信息

req.SetHeaders(map[string]string{"Content-Type":"application/json"})

req.Post("https://www.baidu.com","{\"name\":\"github\"}")

调用req.JSON()内置方法

//直接发磅Json字符串参数
res,err := req.JSON().Post("https://www.baidu.com","{\"name\":\"github\"}")

//自动将Map以Json方式发送参数
res,err := req.JSON().Post("https://www.baidu.com",map[string]interface{}{
    "name":"github"
})
req.SetCookies(map[string]string{
    "name":"jason"
})

超时   

 req.SetTimeout(5)

关闭证书验证

当请求https协议时提示x509: certificate signed by unknown authority时,可关闭证书验证

 req.SetTLSClient(&tls.Config{InsecureSkipVerify: true})

调试模式

req.Debug(true)

连接操作

而且还支持连接操作

req := HttpRequest.NewRequest().Debug(true).SetTimeout(5).SetHeader()

Respone对象

获取返回的Response对象

resp.Response()

获取返回码

 resp.StatusCode()

获取Body主体信息   

resp.Body() 

 返回[]byte和error

获取请求耗时

resp.Time() string   单位是毫秒

获取真实Url

res.Url()

实例代码

package main

import (
   "github.com/kirinlabs/HttpRequest"
   "fmt"
   "log"
)

func main() {

   req := HttpRequest.NewRequest()

   // 设置超时时间,不设置时,默认30s
   req.SetTimeout(5)

   // 设置Headers
   req.SetHeaders(map[string]string{
      "Content-Type": "application/x-www-form-urlencoded", //这也是HttpRequest包的默认设置
   })

   // 设置Cookies
   req.SetCookies(map[string]string{
      "sessionid": "LSIE89SFLKGHHASLC9EETFBVNOPOXNM",
   })

   postData := map[string]interface{}{
      "id":    1,
      "title": "csdn",
   }

   // GET 默认调用方法
   resp, err := req.Get("http://127.0.0.1:8000?name=flyfreely")

   // GET 传参调用方法
   // 第2个参数默认为nil,也可以传参map[string]interface{}
   // 第2个参数不为nil时,会把传入的map以query传参的形式重新构造新url
   // 新的URL: http://127.0.0.1:8000?name=flyfreely&id=1&title=csdn

   //resp, err := req.Get("http://127.0.0.1:8000?name=flyfreely", postData)

   // POST 调用方法

   //resp, err := req.Post("http://127.0.0.1:8000", postData)

   if err != nil {
      log.Println(err)
      return
   }

   if resp.StatusCode() == 200 {
      body, err := resp.Body()
      
      if err != nil {
         log.Println(err)
         return
      }
      
      fmt.Println(string(body))
   }

   或者打印Json
   if resp.StatusCode() == 200 {
      body, err := resp.Json()
      
      if err != nil {
         log.Println(err)
         return
      }
      
      fmt.Println(body)
   }
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149679.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 深度揭秘强化学习技术与落地!智源大会「强化学习与决策智能」专题论坛

    深度揭秘强化学习技术与落地!智源大会「强化学习与决策智能」专题论坛决策智能是国家新一代人工智能的重要发展方向,强化学习是实现决策智能的核心技术之一。在强化学习中,智能体与环境进行不断的交互,基于环境的反馈学习如何选择一系列动作,以使长期累积的奖励和最大。…

    2022年6月2日
  • java的线程是用户态还是内核态_内核态和用户态的区别

    java的线程是用户态还是内核态_内核态和用户态的区别内核态用户态是什么?操作系统对程序的执行权限进行分级,分别为用户态和内核态。用户态相比内核态有较低的执行权限,很多操作是不被操作系统允许的,简单来说就是用户态只能访问内存,防止程序错误影响到其他程序,而内核态则是可以操作系统的程序和普通用户程序内核态:cpu可以访问计算机所有的软硬件资源用户态:cpu权限受限,只能访问到自己内存中的数据,无法访问其他资源为什么要有用户态和内核态?系统需要限制不同的程序之间的访问能力,防止程序获取不相同程序的内存数据,或者外围设备的数据,并发送到网络,所有cpu

    2022年9月14日
  • Hybrid App开发 四大主流平台「建议收藏」

    Hybrid App开发 四大主流平台「建议收藏」HybridApp在过去的两年中已经成为移动界的核心话题,但是作为一名Web开发者来说要如何站在移动互联网的浪潮之巅呢?是选择学习原生开发,研究Java、Object-C、C#等语言,还是选择继续使用网页开发,容忍HTML5功能的局限性?就在开发者左右为难的情况下HybridApp作为一个折中的解决方案诞生了。那么究竟什么才是HybridApp呢?HybridApp概念…

    2022年5月11日
  • MATLAB 处理大数据

    MATLAB 处理大数据如何处理大规模的快数据集大数据指的是创建的数据和供分析的数据的数量与速率迅速增加。此趋势的主要驱动因素是不断增加的信息数字化。采集设备的数量和类型以及其他数据生成机制无时无刻不在增加。大数据源包括来自仪表传感器、卫星和医疗图像的流数据,来自安全摄像机的视频以及派生自金融市场和零售运营的数据。上述来源的大数据集可以包含千兆字节或百万兆字节的数据,并且每天以兆字节或千兆字节的级别增长。

    2022年5月23日
  • Mysql5.5升级到5.7的过程已经踩到的坑

    Mysql5.5升级到5.7的过程已经踩到的坑

    2021年10月22日
  • 学习记录03(网页挂马)

    学习记录03(网页挂马)网页挂马将木马程序上传到网站,使用木马生成器生成一个网马,放到网页空间,在添加代码使木马在网页打开时运行常见的几种方式将木马伪装成页面元素,木马被浏览器自动加载到本地利用脚本运行的漏洞下载木马利用脚本运行的漏洞释放隐含在网页脚本中的木马将木马伪装成缺失的组件。或和缺失的组件绑在一起(flash播放插件等)通过脚本运行调用某些com组件,利用其漏洞下载木马在渲染页面内容的过程中…

    2022年9月29日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号