您现在的位置是:首页 > 正文

go http包基本使用

2024-02-29 11:23:47阅读 1

go http包基本使用

1.基本请求方法

1.1 get和post请求

http包中已经封装好了get和post请求,直接传入要请求的url即可

func TestHttpRequest(t *testing.T)  {
	Get()
	Post()
}

func Get() {
	// http包中提供了Http Get和Post方法,直接传入url调用即可
	r,err := http.Get("http://httpbin.org/get")

	if err != nil{
		panic(err)
	}

	defer func() {
		_ = r.Body.Close()
	}()
	
	bytes,_ := ioutil.ReadAll(r.Body)
	fmt.Println(string(bytes))
}

func Post()  {
	r,err := http.Post("http://httpbin.org/post","",nil)

	if err != nil{
		panic(err)
	}

	defer func() {
		_ = r.Body.Close()
	}()

	bytes,_ := ioutil.ReadAll(r.Body)
	fmt.Println(string(bytes))
}

1.2 put和delete方法

其实http包下的get和post方法都是调用的defaultClient的Get和post方法

func Get(url string) (resp *Response, err error) {
	return DefaultClient.Get(url)
}

func Post(url, contentType string, body io.Reader) (resp *Response, err error) {
	return DefaultClient.Post(url, contentType, body)
}

而defaultClient是一个client结构体

// DefaultClient is the default Client and is used by Get, Head, and Post.
var DefaultClient = &Client{}

然后就会调用client实例方法:

  • 传入请求方法,请求地址构造请求
  • 执行client的do方法,do方法就是真正请求和封装响应的方法
func (c *Client) Get(url string) (resp *Response, err error) {
	req, err := NewRequest("GET", url, nil)
	if err != nil {
		return nil, err
	}
	return c.Do(req)
}

所以通过以上的分析,我们也可以写出我们自己封装的put和delete方法:

func Put()  {
	r,err := http.NewRequest("PUT","http://httpbin.org/put",nil)
	if err != nil{
		panic(err)
	}
	// 执行请求,获取响应
	resp,_ := http.DefaultClient.Do(r)
	defer func() {
		resp.Body.Close()
	}()
	bytes,_ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(bytes))
}

1.3 带参数和请求头的请求

上边提到的请求都是无参数请求,但是在实际开发中,一般是带有请求参数的,我们可以使用


func GetWithParams() {

	r,_ := http.NewRequest(http.MethodGet,"http://httpbin.org/get",nil);

	// 带上参数,通过映射 + encode的方式带上
	params := make(url.Values)
	params.Add("age","1")
	params.Add("name","kevin")
	r.URL.RawQuery = params.Encode()

	res,err := http.DefaultClient.Do(r)

	if err != nil{
		panic(err)
	}

	defer func() {
		_ = res.Body.Close()
	}()

	bytes,_ := ioutil.ReadAll(res.Body)
	fmt.Println(string(bytes))
}

上边是带参数的get请求,其实带参数的post请求也是差不多的。http.Post方法的第三个参数就是post请求携带的参数

func PostWithParams()  {
	// json的方式提交参数请求
	u := User{
		Name: "kevin",
		Age: 23,
	}
	// 转json
	params,_ := json.Marshal(u)
	r,err := http.Post("http://httpbin.org/post",
		"application/json",
		bytes2.NewReader(params),
	)

	if err != nil{
		panic(err)
	}

	defer func() {
		_ = r.Body.Close()
	}()

	bytes,_ := ioutil.ReadAll(r.Body)
	fmt.Println(string(bytes))
}

对于添加请求头,直接往request中的header添加映射即可

	// 添加请求头,request结构体中的Header就是一个映射,直接add即可
	r.Header.Add("user-agent","test")

1.4 获取响应信息

	// 获取响应状态信息
	fmt.Println(res.Status)
	// 获取响应状态码
	fmt.Println(res.StatusCode)
	// 获取响应头信息
	fmt.Println(res.Header)
	// 获取响应内容
	bytes,_ := ioutil.ReadAll(res.Body)
	fmt.Println(string(bytes))

1.5 文件下载

文件下载其实就是两步:

  • http发起get请求下载url
  • 创建文件将response的body复制到新文件
func Download(url string,fileName string)  {
	r,_ := http.Get(url)
	f,_ := os.Create(fileName)
	defer func() {
		f.Close()
		r.Body.Close()
	}()
	io.Copy(f,r.Body)
}

1.6 cookie

这一块主要是设置cookie和获取cookie

	// 获取cookie,[]cookie数组类型
	cookies := r.Cookies()

	// set cookie
	secondRequest,_ := http.NewRequest(http.MethodGet,"",nil)
	for _,cookie := range cookies{
		secondRequest.AddCookie(cookie)
	}

网站文章

  • 人工智能实验报告

    人工智能实验报告

    贵州师范大学计算机实验报告 课程名称: 人工智能 班级: 13 级计本 实验日期: 5 月 9日 ...

    2024-02-29 11:23:21
  • [学习笔记]斯坦纳树

    [学习笔记]斯坦纳树

    处理一种这样的问题:斯坦纳树问题是组合优化问题,与最小生成树相似,是最短网络的一种。最小生成树是在给定的点集和边中寻求最短网络使所有点连通。而最小斯坦纳树允许在给定点外增加额外的点,使生成的最短网络开销最小。——by 度娘简单来讲一个无向图,k个关键点,每个边有边权,求联通这k个点的最小代价最小生成树可以认为是斯坦纳树的特殊情况由于k个关键点的高度要求精确打击,只能用...

    2024-02-29 11:23:16
  • mstsc 和mstsc admin 区别

    mstsc 和mstsc /admin分别远程连接服务器区别:连接身份不同、程序加载不同、执行操作不同。一、连接身份不同1、Mstsc远程连接服务器:Mstsc远程连接服务器的连接标识是普通用户。如果其他更高级的用户已登录,则无法连接。2、Mstsc/Admin远程连接服务器:Mstsc/Admin远程连接服务器的连接标识为管理员用户,连接优先级最高。具有其他登录级别的用户将退出连接。...

    2024-02-29 11:23:09
  • 前端两三问

    前端两三问

    1、js 获取当前日期星期几getWeek(time) { let weekDay = ["周日","周一", "周二", "周三", "周四", "周五", "周六"]; let myDate = new Date(Date.parse(time)); return weekDay[myDate.getDay()]},console.log...

    2024-02-29 11:22:39
  • docker安装nginx并且部署前端项目

    docker安装nginx并且部署前端项目

    1.简介本文主要介绍如何使用docker安装nginx,以及如何将前端打包好的vue项目部署到nginx上。2.操作(1)拉取nginx镜像: docker pull nginx (2)咱们先把...

    2024-02-29 11:22:31
  • “TypeError: Cannot read properties of undefined (reading ‘0‘)“。Vue下v-if条件渲染报错解决

    “TypeError: Cannot read properties of undefined (reading ‘0‘)“。Vue下v-if条件渲染报错解决

    代码如下 -- {{item}}&l

    2024-02-29 11:22:24
  • oracle安装

    oracle安装

    修改tnsnames.ora配置文件,这个配置文件是安装oracle服务端才有,我们直接安装客户端是没有的,可以在网上直接找这个文件来修改即可,放在不容易删的目录。host为oracle服务器地址。设置客户端的编码与服务器的编码一致,防止出现中文乱码的问题。环境变量配置,名字必须为TNS_ADMIN,不然有问题。进入到oracle客户端的目录执行命令。

    2024-02-29 11:22:17
  • 【iOS】基本控件:文本输入框、开关、分段控件、滑块与输入键盘隐藏的问题

    【iOS】基本控件:文本输入框、开关、分段控件、滑块与输入键盘隐藏的问题

    文本输入框TextField、开关Switch、分段控件Segmented Control和滑块Slider是iOS开发中基本的控件之一。下面将说明这些怎么使用。在文本输入框TextField还同时包含输入键盘隐藏问题、输入长度限制问题,因为iOS文本输入框TextField的输入键盘隐藏问题、输入长度限制不像C#在傍边的控件属性栏、安卓在xml中一个属性设置下就可以,需要用代码实现。下面用一个例

    2024-02-29 11:21:49
  • java基础-集合,继承,修饰符,多态

    java基础-集合,继承,修饰符,多态

    理解继承修饰符多态抽象类

    2024-02-29 11:21:44
  • Elasticsearch-使用篇

    es学习使用

    2024-02-29 11:21:35