golang http请求封装

news/2025/2/1 14:46:18/

http请求封装在项目中非常普遍,下面笔者封装了http post请求传json、form 和get请求,以备将来使用

1、POST请求

1.1、POST请求发送 json

这里发送json笔者使用了2种方式,一种是golang 自带的 http.Post方法,另一是 http.NewRequest

方法。二者的区别是http.Post方法不能发送自定义的header数据;而http.NewRequest方法可以发送额外的自定义header数据

先看使用golang 自带的 http.Post方法封装的POST请求

func HttpPostJson(url string, requestBody []byte) (string, error) {response, er := http.Post(url, "application/json", bytes.NewBuffer(requestBody))if er != nil {return "", er}defer response.Body.Close()body, er2 := ioutil.ReadAll(response.Body)if er2 != nil {return "", er2}return string(body), nil
}

再看使用http.NewRequest方法封装的POST请求

看golang的源代码可以知道 http.Post方法底层就是使用的 NewRequest 方法,因此NewRequest方法更加灵活

func HttpPost(url string, header map[string]string, requestBody []byte) (string, error) {httpClient := &http.Client{}request, er := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(requestBody))if er != nil {return "", er}for key, value := range header {request.Header.Set(key, value)}//设置请求头Content-Typerequest.Header.Set("Content-Type", "application/json")response, er2 := httpClient.Do(request)if er2 != nil {return "", er2}defer response.Body.Close()body, er3 := ioutil.ReadAll(response.Body)if er3 != nil {return "", er3}return string(body), nil
}

1.2、POST请求发送form

form数据使用map存放,map的key是字符串,value是字符串切片

func HttpPostForm(url string, form map[string][]string) (string, error) {response, er := http.PostForm(url, form)if er != nil {return "", er}defer response.Body.Close()body, er2 := ioutil.ReadAll(response.Body)if er2 != nil {return "", er2}return string(body), nil
}

可以携带自定义header的post请求发送form

笔者使用NewRequest 方法封装的可以携带自定义header的form请求

func HttpPostHeaderForm(requestUrl string, header map[string]string, form map[string][]string) (string, error) {httpClient := &http.Client{}var data url.Valuesdata = map[string][]string{}for k, v := range form {data[k] = v}request, er := http.NewRequest(http.MethodPost, requestUrl, strings.NewReader(data.Encode()))if er != nil {return "", er}request.Header.Set("Content-Type", "application/x-www-form-urlencoded")//设置自定义headerfor key, value := range header {request.Header.Set(key, value)}response, er := httpClient.Do(request)if er != nil {return "", er}defer response.Body.Close()body, er2 := ioutil.ReadAll(response.Body)if er2 != nil {return "", er2}return string(body), nil
}

2、GET请求

func HttpGet(url string) (string, error) {response, er := http.Get(url)if er != nil {return "", er}defer response.Body.Close()body, er2 := ioutil.ReadAll(response.Body)if er2 != nil {return "", er2}return string(body), nil
}

3、测试

这里服务端笔者使用springboot项目创建,用来接收请求,端口默认8080

参数类

package com.wsjz.demo.param;import lombok.Data;@Data
public class AddParam {private String name;private Integer age;
}

controller

package com.wsjz.demo.controller;import com.wsjz.demo.param.AddParam;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;@RestController
public class DemoController {@PostMapping("/json/add")public String jsonAdd(@RequestBody AddParam param, HttpServletRequest request) {System.out.println(request.getHeader("token"));System.out.println(param);return "json ok";}@PostMapping("/form/add")public String formAdd(AddParam param, HttpServletRequest request) {System.out.println(request.getHeader("token"));System.out.println(param);return "form ok";}@GetMapping("/get/add")public String getAdd(AddParam param) {System.out.println(param);return "get ok";}}

golang测试代码

新建User结构体做为参数

type User struct {Name string `json:"name"`Age  int    `json:"age"`
}

(1)、测试HttpPostJson方法

func TestHttpPostJson(t *testing.T) {url := "http://localhost:8080/json/add"var user = User{Name: "举头西北浮云,倚天万里须长剑,人言此地,夜深长见,斗牛光焰",Age:  17,}requestBody, er := json.Marshal(user)if er != nil {log.Fatal(er)}response, er := HttpPostJson(url, requestBody)if er != nil {fmt.Println(er)}fmt.Println(response)
}

运行效果

(2)、测试HttpPost方法

func TestHttpPost(t *testing.T) {url := "http://localhost:8080/json/add"var header = make(map[string]string)header["token"] = "2492dc007dfc4ce8adcc8b42b21641f4"var user = User{Name: "我见青山多妩媚",Age:  17,}requestBody, er := json.Marshal(user)if er != nil {log.Fatal(er)}response, er2 := HttpPost(url, header, requestBody)if er2 != nil {log.Fatal(er2)}fmt.Println(response)
}

运行效果

(3)、测试HttpPostForm方法

func TestHttpPostForm(t *testing.T) {url := "http://localhost:8080/form/add"var form = make(map[string][]string)form["name"] = []string{"可怜今夕月,向何处,去悠悠"}form["age"] = []string{"18"}response, er := HttpPostForm(url, form)if er != nil {fmt.Println(er)}fmt.Println(response)
}

运行效果

(4)、测试HttpPostHeaderForm方法

func TestHttpPostHeaderForm(t *testing.T) {url := "http://localhost:8080/form/add"var header = make(map[string]string)header["token"] = "0a8b903b7d7448e3ab007caab081965c"var form = make(map[string][]string)form["name"] = []string{"相思字,空盈幅,相思意,何时足"}form["age"] = []string{"18"}response, er := HttpPostHeaderForm(url, header, form)if er != nil {fmt.Println(er)}fmt.Println(response)
}

运行效果

(5)、测试HttpGet方法

func TestHttpGet(t *testing.T) {//对中文进行编码name := url.QueryEscape("乘风好去,长空万里,直下看山河")requestUrl := "http://localhost:8080/get/add?name=" + name + "&age=19"response, er := HttpGet(requestUrl)if er != nil {fmt.Println(er)}fmt.Println(response)
}

运行效果

至此完


http://www.ppmy.cn/news/143473.html

相关文章

调制解调器以及ADSL拨号上网

调制解调器,英文名称为:modem,因此又称为“猫”.调制解调器,是一种计算机硬件,它能把计算机的数字信号翻译成可沿普通电话线传送的脉冲信号,而这些脉冲信号又可被线路另一端的另一个调制解调器接收&#xf…

cisco 路由器 ADSL拨号上网配置

原文地址:http://blog.sina.com.cn/s/blog_61c07ac501015ek0.htm 虚拟拨号接口 cisco(config)>interface Dialer1 //定义拨号端口Dialer1 cisco(config)>description adsl-dialer cisco(config)>ip address negotiated //拨号接口的地址是通过协商获得的…

国际儿童节

节日由来 国际儿童节儿童作品画(11张) 国际儿童节的设立,和发生在二战期间一次屠杀——利迪策惨案有关。1942年6月10日,德国法西斯枪杀了捷克利迪策村16岁以上的男性公民140余人和全部婴儿,并把妇女和90名儿童押往集中营。村里的房舍、建筑物…

计算机应用技术

文章目录 计算机应用技术 \color{red}{计算机应用技术} 计算机应用技术 第一章:计算机及其应用概述 \color{blue}{第一章:计算机及其应用概述} 第一章:计算机及其应用概述 第一节:计算机的发展历史 \color{green}{第一节&#xff…

前端项目总结干货 + 渡一、coderwhy、黑马、尚硅谷实操笔记(第二版,持续更新中~~~)

前端学习笔记(温馨提示:最好根据目录查看笔记) 构建vite、vue项目 1.npm create vitelatest my-vue-app 2.vue create vue01知识储备 响应式原理(渡一) 什么是数据响应式? 函数与数据的关联(重要) 数…

最流行的android组件大全

最流行的android组件大全 目录 [−] Awesome Android 工具和教程 UI组件 类库 游戏引擎 Android HTML5应用 新增加的项目 (from 2015.06) 最后更新 2015-09-15 增加 更多的开源项目。 2015-08-21 增加 awssome android XXXXX,在文章的前面。 2015-08-12 增加 很大一堆开源UI库等…

Halo 博客网站的SQL

Halo 博客网站的SQL 上一次网站被攻击,导致数据库被删,想用binglog恢复,需要存在表结构,于是我备份一下SQL -- MySQL版本: 5.7.34 -- 数据库: halodb ---- --------------------------------------------…

mysql语法大全和jdbc知识汇总

以前自己学习时候的笔记 导入数据 load data local infile "路径" into table 表名person load data local infile C:\\Users\\Administrator\\Desktop\\xiaosuo_l.txt into table xiaosuo_l fields terminated by ,;LOAD DATA LOCAL INFILE dump.txt INTO TABLE …