golang中发送http请求的几种常见情况
整理一下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类型返回过来, 之后再进行其他的处理。
golang中发送http请求的几种常见情况的更多相关文章
- PHP发送HTTP请求的几种方式
转发:https://blog.tanteng.me/2017/07/php-curl-guzzlehttp/ 1)PHP开发中我们常用CURL 方式封装 HTTP请求,什么是CURL? CURL 是 ...
- .net中对HTTP请求的两种请求:Get和Post的操作
.net中对HTTP请求的简单操作总结 第一部分,HTTP协议的简单了解 一. 什么是HTTP协议 超文本传输协议 (HTTP-Hypertext transfer protoco ...
- php发送post请求的三种方法示例
本文分享下php发送post请求的三种方法与示例代码,分别使用curl.file_get_content.fsocket来实现post提交数据,大家做个参考. php发送post请求的三种方法,分别使 ...
- Vue中发送ajax请求——axios使用详解
axios 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 node.js 中使用 功能特性 在浏览器中发送 XMLHttpRequests 请求 在 node.js 中发送 htt ...
- 移动Web开发图片自适应两种常见情况解决方案
本文主要说的是Web中图片根据手机屏幕大小自适应居中显示,图片自适应两种常见情况解决方案.开始吧 在做配合手机客户端的Web wap页面时,发现文章对图片显示的需求有两种特别重要的情况,一是对于图集, ...
- 移动站Web开发图片自适应两种常见情况解决方案
本文主要说的是Web中图片根据手机屏幕大小自适应居中显示,图片自适应两种常见情况解决方案.开始吧 在做配合手机客户端的Web wap页面时,发现文章对图片显示的需求有两种特别重要的情况,一是对于图集, ...
- 安卓中使用OkHttp发送数据请求的两种方式(同、异步的GET、POST) 示例-- Android基础
1.首先看一下最终效果的截图,看看是不是你想要的,这个年代大家都很忙,开门见山很重要! 简要说下,点击不同按钮可以实现通过不同的方式发送OkHttp请求,并返回数据,这里请求的是网页,所以返回的都是些 ...
- iOS中发送HTTP请求的方案
在iOS中,常见的发送HTTP请求的方案有 苹果原生(自带) NSURLConnection:用法简单,最古老最经典的一种方案 NSURLSession:功能比NSURLConnection更加强大, ...
- (转) c/c++调用libcurl库发送http请求的两种基本用法
libcurl主要提供了两种发送http请求的方式,分别是Easy interface方式和multi interface方式,前者是采用阻塞的方式发送单条数据,后者采用组合的方式可以一次性发送多条数 ...
随机推荐
- 2017/05/07 java 基础 随笔
1.^异或 逻辑运算符 两边相同为false 不同为ture 2.键盘录入 package com.huawei; /** * 键盘录入 * @author Eric * */ import j ...
- SpringBoot整合MyBatis(XML)
(1).添加依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId> ...
- Linux的capability深入分析(1)【转】
转自:https://blog.csdn.net/wangpengqi/article/details/9821227 一)概述: )从2.1版开始,Linux内核有了能力(capability)的概 ...
- Linux内核驱动之延时 【转】
转自:http://blog.chinaunix.net/uid-24219701-id-3288103.html jiffies 计数器 定时器中断由系统定时硬件以规律地间隔产生; 这个间隔在启动 ...
- 从Linux内核中获取真随机数【转】
转自:http://www.cnblogs.com/bigship/archive/2010/04/04/1704228.html 内核随机数产生器 Linux内核实现了一个随机数产生器,从理论上说这 ...
- springboot系列四、配置模板引擎、配置热部署
一.配置模板引擎 在之前所见到的信息显示发现都是以 Rest 风格进行显示,但是很明显在实际的开发之中,所有数据的显示最终都应该交由页面完成,但是这个页面并不是*.jsp 页面,而是普通的*.html ...
- springboot系列一、springboot产生背景及介绍
一.为什么用Springboot 长期以来 Java 的开发一直让人所诟病: ·Java 项目开发复杂度极其高: · Java 项目的维护非常困难: · 在云时代如何实现项目的快速部署以及快速启动: ...
- java selenium操作safari
SafariDriver是一个Safari浏览器的扩展.和Firefox类似,在selenium-safari-driver-xxx.jar包中org.openqa.selenium.safari路径 ...
- PHP 获取时间
1.获取系统当前时间 echo "date('Y-m-d',time())"; 2.获取系统前一天时间 echo "date("Y-m-d",strt ...
- js获取当前有效样式
js获取有效样式 节点.currentStyle["属性名"] 兼容ie方法(只有ie有效) getcomputedStyle(节点)["属性名&q ...