详解golang中发送http请求的几种常见情况

方式一 使用http.Newrequest

先生成http.client -> 再生成 http.request -> 之后提交请求:client.Do(request) -> 处理返回结果,每一步的过程都可以设置一些具体的参数,下面是一个最朴素最基本的例子:

//question ???将stdout重定向为response信息???
package main

import (
  "fmt"
  "io"
  "net/http"
  "os"
)

func main() {
  //生成client 参数为默认
  client := &http.Client{}

  //生成要访问的url
  url := "http://www.baidu.com"

  //提交请求
  reqest, err := http.NewRequest("GET", url, nil)

  if err != nil {
    panic(err)
  }

  //处理返回结果
  response, _ := client.Do(reqest)

  //将结果定位到标准输出 也可以直接打印出来 或者定位到其他地方进行相应的处理
  stdout := os.Stdout
  _, err = io.Copy(stdout, response.Body)

  //返回的状态码
  status := response.StatusCode

  fmt.Println(status)
}

方式二 先生成client,之后用client.get/post..

client结构自己也有一些发送api的方法,比如client.get,client.post,client.postform..等等。基本上涵盖了主要的http请求的类型,通常不进行什么特殊的配置的话,这样就可以了,其实client的get或者post方法,也是对http.Newerequest方法的封装,里面还额外添加了req.Header.Set("Content-Type", bodyType)一般用的话,也是ok的

方式三 http. Get/Post..

具体实现的时候,还是采用的先前提到的模式,先生成一个默认的client,之后调用http.Newrequest方法。

对每个步骤进行细节性的说明

生成client时候的参数配置

最常见的一个参数是使用https的方式发送信息时候client端的设置。如果生成client的时候,什么信息都不添加,就会使用默认的值。具体的信息包括:

  • Transport RoundTripper
  • CheckRedirect func(req *Request, via []*Request) error
  • Jar CookieJar
  • Timeout time.Duration

第一个参数是一个RoundTripper接口,里面包含了一个RoundTrip函数,指定了一些http请求的基本机制。http.Transport中涉及到的参数较多,要是不指定的话,就会使用默认的DefaultTransport参数,里面包含一些默认的请求时间以及proxy机制之类的。具体的细节参数涉及到好多,有的都没有使用到过比如那些我握手时间之类的,目前使用到的最多的就是https的相关参数:TLSClientConfig,这是一个*tls.Config类型,其中涉及到的参数还是有很多,一个基本的是用案例如下,仅仅是在配置中制定了rooca以及客户度端使用的证书。相关的https的内容可以参考之前的这一篇

通常发送https请求的时候,前面的参数可以使用如下方式进行处理:

  pool := x509.NewCertPool()
  caCertPath := "certs/cert_server/ca.crt"

  caCrt, err := ioutil.ReadFile(caCertPath)
  if err != nil {
    fmt.Println("ReadFile err:", err)
    return
  }
  pool.AppendCertsFromPEM(caCrt)

  cliCrt, err := tls.LoadX509KeyPair("certs/cert_server/client.crt", "certs/cert_server/client.key")
  if err != nil {
    fmt.Println("Loadx509keypair err:", err)
    return
  }

  tr := &http.Transport{
    TLSClientConfig: &tls.Config{
      RootCAs:   pool,
      Certificates: []tls.Certificate{cliCrt},
    },
  }
  client := &http.Client{Transport: tr}

生成request时候的参数配置

生成request的时候,主要的是几个基本的参数。NewRequest函数有三个基本的参数,NewRequest(method, urlStr string, body io.Reader)第一个是请求的类型,GET, POST, PUT, etc.要设成大写的形式。第二个参数是请求要访问的url,第三个参数是请求的body中的内容,需要是一个io.Reader的类型。

注意io.Reader的接口中是一个Read方法,实现了Read方法的类型应该都可以作为io.Reader来返回,Read(p []byte) (n int, err error)函数具体的功能就是读入len(p)长度的内容到p中,返回读入的长度以及错误信息。

通常是采用strings.NewReader函数,将一个string类型转化为io.Reader类型,或者bytes.NewBuffer函数,将[]byte类型转化为io.Reader类型。

此外还可以给request的header中添加一些额外的信息,比如下面例子中添加了请求的body的类型以及token的信息。

  reqest.Header.Set("Content-Type", "application/x-www-form-urlencoded")
  reqest.Header.Set("Authorization", "qwertyuiopasdfghjklzxcvbnm1234567890")

还有比如模拟表单提交,可以把提交的类型设置为url.Values类型再进行Encode:

// use map as struct
  var clusterinfo = url.Values{}
  //var clusterinfo = map[string]string{}
  clusterinfo.Add("userName", user)
  clusterinfo.Add("password", pw)
  clusterinfo.Add("cloudName", clustername)
  clusterinfo.Add("masterIp", masterip)
  clusterinfo.Add("cacrt", string(caCrt))

  data := clusterinfo.Encode()

  url := "https://10.10.105.124:8443/user/checkAndUpdate"
  reqest, err := http.NewRequest("POST", url, strings.NewReader(data))

最常见的一种情况是发送一个json文件过去,可以把Header的类型设置成为:

"Content-Type", "application/json; charset=utf-8"

其余的部分按照先前同样的方式进行设置发送提交就好。

request的类型的属性还是比较多的,慢慢整理。

生成的response结果的处理

一般在client构建好之后,要采用client.Do(request)方法提交client请求,之后会返回一个*Response类型。response中的参数一般也比较多,我们需要的最多的通常是Body参数,一般通过body, _ := ioutil.ReadAll(resp.Body)会把body转化为[]byte类型返回过来, 之后再进行其他的处理。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • golang编程入门之http请求天气实例

    golang学习第一波,使用http get请求高德天气接口. 一.准备内容: 1.注册高德开发者账号,申请key 2.golang开发工具LiteIDE(可自行百度). 或者https://www.jb51.net/softjc/119086.html 3.大致了解下golang基础语法. 二.直接上代码 因为代码注释非常详尽,故直接上代码. package main import ( "fmt" "io/ioutil" "net/http"

  • 详解golang中发送http请求的几种常见情况

    方式一 使用http.Newrequest 先生成http.client -> 再生成 http.request -> 之后提交请求:client.Do(request) -> 处理返回结果,每一步的过程都可以设置一些具体的参数,下面是一个最朴素最基本的例子: //question ???将stdout重定向为response信息??? package main import ( "fmt" "io" "net/http" &q

  • 详解Golang中Channel的用法

    如果说goroutine是Go语言程序的并发体的话,那么channels则是它们之间的通信机制.一个channel是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发送值信息. 1 创建channel 每个channel都有一个特殊的类型,也就是channels可发送数据的类型.一个可以发送int类型数据 的channel一般写为chan int.使用内置的make函数,如果第二个参数大于0,则表示创建一个带缓存的channel. ch := make(chan in

  • 一文详解Golang中net/http包的实现原理

    目录 前言 http包执行流程 http包源码分析 端口监听 请求解析 路由分配 响应处理 前言 Go语言自带的net/http包提供了HTTP客户端和服务端的实现,实现一个简单的http服务非常容易,其自带了一些列结构和方法来帮助开发者简化HTTP服务开发的相关流程,因此我们不需要依赖任何第三方组件就能构建并启动一个高并发的HTTP服务器,net/http包在编写web应用中有很重要的作用,这篇文章会学习如何用 net/http 自己编写实现一个 HTTP Server 并探究其实现原理,具体

  • 详解Golang中Context的原理和使用技巧

    目录 Context 背景 和 适用场景 Context 的背景 Context 的功能和目的 Context 的基本使用 Context 的同步控制设计 Context 的定义和实现 Context interface 接口定义 parent Context 的具体实现 Context 的继承和各种 With 系列函数 Context 的常用方法实例 1. 调用 Context Done方法取消 2. 通过 context.WithValue 来传值 3. 超时取消 context.WithT

  • 详解Golang中select的使用与源码分析

    目录 背景 select 流程 背景 golang 中主推 channel 通信.单个 channel 的通信可以通过一个goroutine往 channel 发数据,另外一个从channel取数据进行.这是阻塞的,因为要想顺利执行完这个步骤,需要 channel 准备好才行,准备好的条件如下: 1.发送 缓存有空间(如果是有缓存的 channel) 有等待接收的 goroutine 2.接收 缓存有数据(如果是有缓存的 channel) 有等待发送的 goroutine 对channel实际使

  • 一文详解Golang中consul的基本使用

    目录 consul consul的安装和部署 docker安装 consul镜像的启动 启动一个tcp_health_check的服务注册 http版 服务发现 consul consul是一个开源服务注册和服务发现的中心,可以用于微服务的注册和服务之间的调用的发现,帮助上游服务找到下游服务的具体ip:port或者是domain,也可以使用dns的方式让consul帮你去做转发,具体介绍请看consul的官网,consul区分server-agent和client-agent,client-ag

  • 详解使用fetch发送post请求时的参数处理

    详解使用fetch发送post请求时的参数处理 不考虑古董浏览器之后,使用fetch来发送ajax请求,变得非常爽快和时尚. 但是,发送post请求的时候,把笔者卡了一下.后台如下获取参数时,总是为null String q = req.getParameter("q"); 研究了好久,总算写出正确的使用方式了.直接上代码. fetch("/search/project/", { method: "POST", headers: { 'Conte

  • 详解Golang中的各种时间操作

    需求 时间格式的转换比较麻烦,自己写了个工具,可以通过工具中的这些方法相互调用转成自己想要的格式,代码如下,后续有新的函数再添加 实现代码 package utils import "time" const ( TIMEFORMAT = "20060102150405" NORMALTIMEFORMAT = "2006-01-02 15:04:05" ) // 当前时间 func GetTime() time.Time{ return time.

  • 详解golang中的method

    什么是method(方法)?method是函数的另外一种形态,隶属于某个类型的方法. method的语法: func (r Receiver) funcName (parameters) (result) receiver可以看作是method的第一个参数,method并且支持继承和重写. Go中虽没有class,但依旧有method 通过显示说明receiver来实现与某个类型的结合 只能为同一个包中的类型定义方法 receiver可以是类型的值或者指针 不存在方法重载 可以使用值或指针来调用

  • 详解Idea中HTTP Client请求测试工具的使用

    前言: 以前在本地测试一些接口,我都是使用postman,偶然发了Idea自带的请求测试工具HTTP Client,我就开始使用HTTP Client了,但是在某些下载流类接口的测试中,还是要使用postman,但是普通的接口HTTP Client已经足够满足的需求. 正文: 使用HTTP Client的Idea版本最好在2018以上,不然体验感不是很好.下面,我将介绍一下,这个怎么使用. 1.使用入口: 方式一:在Controller类中,方法旁边有一个小三角,如果不要携带任何参数,就可以直接

随机推荐