golang http请求封装

news2024/12/23 23:09:19

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-Type
	request.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.Values
	data = 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")

	//设置自定义header
	for 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.coloradmin.cn/o/597107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iphone苹果手机如何备份整个手机数据?

手机上的数据变得越来越重要,大家也越来越注重数据安全。如果手机设备丢失的话,不仅是设备的丢失,还是数据的丢失。因此,备份数据就显得很重要。那么,iphone如何备份整个手机,苹果怎么查备份的照片&#xf…

14.3:给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有可能的拼接结果中字典序最小的结果

给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有可能的拼接结果中字典序最小的结果 贪心写法 首先注意的一点是:如果两个字符串的长度相同,“abc”,“abd”,肯定是“abc”的字典序最…

15.2:分金条的最小代价

一块金条切成两半,是需要花费和长度数值一样的铜板 比如长度为20的金条,不管怎么切都要花费20个铜板,一群人想整分整块金条,怎么分最省铜板? 例如,给定数组{10,20,30},代表一共三个人,整块金条…

情绪管理ABC法

情绪管理ABC法 是由著名心理学家艾利斯(Albert Ellis)提出的一种情绪管理方法。 模型介绍 情绪,不取决于发生的事实,取决于我们如何看待这件事ABC理论认为,我们的情绪©,其实与发生的事件(A)无关&…

亚马逊云科技赋能敦煌网集团上云,云上新架构带来价值

敦煌网成立于2004年,是领先的B2B跨境电子商务交易平台,敦煌网在品牌优势、技术优势、运营优势、用户优势四大维度上,已建立起竞争优势。随着跨境电商的日趋成熟,经营范围持续扩大、品类和渠道的增加,以及AIGC等行业新技…

Java程序猿搬砖笔记(十三)

文章目录 MySQL数据库生成自动增长序号MySQL修改密码SpringBoot定时任务解决Mybatis出现的各种Parameter not found. Available parameters are [ , ]Mybatis的foreach标签遍历mapSpringBoot项目打包SpringBoot Async使用注意事项Spring Cloud Config bootstrap文件&#xff…

内蒙古自治区出台加快充换电基础设施建设实施方案

摘要:为深入贯彻落实《国务院办公厅关于印发新能源汽车产业发展规划(2021—2035年)的通知》(国办发 ﹝2020﹞39号)、《国家发展改革委等部门关于进一步提升电动汽车充电基础设施服务保障能力的实施意见》(发…

杭州久斗贸易有限公司官网上线 | LTD酒水行业案例分享

​一、公司介绍 杭州久斗贸易有限公司是集现代化电子商务与传统销售网络于一体的新兴企业。成立于2022年12月,是杭州地区一家专业的酒类销售贸易公司。 公司股东及经营者拥有二十年以上国内名酒销售经验,目前主营茅台.五粮液等高端白酒批发业务&am…

halcon matlab 中pose matrix之间的转换

pose_to_hom_mat3d (TransPose, HomMat3D) 原理: matlab 验证: function [a,b]getMatrix(pose) syms x y z; xdeg2rad(pose(4)); ydeg2rad(pose(5)); zdeg2rad(pose(6)); mat_x[1 0 0 0;0 cos(x) -sin(x) 0;0 sin(x) cos(x) 0; 0 0 0 1]; mat_…

Object.defineProperty到底有啥用

Object.defineProperty Object.defineproperty 的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性 使用Object.defineProperty之前 number和person之间并无关联 使用Object.defineProperty之后 person和number之间有了关联;修…

1164 Good in C(38行代码+超详细注释)

分数 20 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 When your interviewer asks you to write "Hello World" using C, can you do as the following figure shows? Input Specification: Each input file contains one test case. For each case, the …

Ceph 分布式存储

Ceph概述 存储基础 单机存储设备 ●DAS(直接附加存储,是直接接到计算机的主板总线上去的存储) IDE、SATA、SCSI、SAS、USB 接口的磁盘 所谓接口就是一种存储设备驱动下的磁盘设备,提供块级别的存储 ●NAS(网络附加存…

jwt----介绍,原理

token:服务的生成的加密字符串,如果存在客户端浏览器上,就叫cookie -三部分:头,荷载,签名 -签发:登录成功,签发 -认证:认证类中认证 # jwt&…

火伞云全球节点分布国家及城市列表

火伞云融合CDN划分为中国境内和中国境外两个服务区域。 中国境内区域为中国大陆全地区统一计费(不含港澳台),全球用户访问均会调度至中国内地加速节点进行服务。 中国境外区域,按CDN 节点服务器所在地区,划分为北美地…

uni-app使用echarts绘制数据可视化图

先打开项目 然后选择 使用命令行窗口打开所在目录(U) 在弹出的终端中输入指令来引入依赖 npm install echarts然后 我们 打开echarts的官网 点击这里这个 示例 找一个自己喜欢的案例点进去 我这里就用一个最简单的吧 代码看着不会乱 将他这个 option中的内容复制出来 然后…

重塑未来:科技创新驱动社会变革

科技创新驱动社会变革 前言正文一、人工智能(AI):智能技术的崛起二、区块链技术:去中心化的数字经济三、量子计算:开启未来的大门四、生物技术:拓展医学与农业的边界 总结 前言 近年来,科技领域…

Python开发工具PyCharm入门指南 - 如何创建密码短语生成器(下)

PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外,该IDE提供了一些高级功能,以用于Django框架下的专业Web开发。 PyCharm 最新版下载 在上篇文章中,我们学习了密码短语、密码短语…

统信UOS系统开发笔记(二):国产统信UOS系统搭建Qt开发环境安装Qt5.12

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130984263 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

得物人事系统时间轴设计的演化历程

1 什么是时间轴 ~(以上图片出自电影《星际穿越》)~ 如果你看过《星际穿越》,应该对这一幕印象深刻,女儿墨菲所处的房间,按照时间分为了无数个三维空间实体。三维空间加时间组合成四维空间,即时空。 时间轴…