Golang:发起http请求-GET带参数、POST发送Form和JSON数据

文档

  • https://pkg.go.dev/net/http
  • https://pkg.go.dev/net/url

目录

    • 1、发起GET请求
    • 2、发起带参GET请求
    • 3、POST请求提交Form表单
    • 4、POST请求提交Json数据
    • 5、接收响应数据,json转为map
    • 6、自定义请求头

1、发起GET请求

使用net/http 可以很容易发起get请求

package main

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

func main() {
    resp, _ := http.Get("https://httpbin.org/get")
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)

    fmt.Print(string(body))
}

响应

{
  "args": {}, 
  "headers": {
    "Accept-Encoding": "gzip", 
    "Host": "httpbin.org", 
    "User-Agent": "Go-http-client/2.0", 
    "X-Amzn-Trace-Id": "Root=1-664863e9-34028ecc4c56c08d6ac5d923"
  }, 
  "origin": "127.0.0.1", 
  "url": "https://httpbin.org/get"
}

2、发起带参GET请求

使用net/url将查询参数拼接到url上,再使用net/http发起http请求

package main

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

func main() {
    targetUrl := "https://httpbin.org/get"

    u, _ := url.ParseRequestURI(targetUrl)

    // URL param
    data := url.Values{}
    data.Set("name", "Tom")
    data.Set("age", "18")

    u.RawQuery = data.Encode() // URL encode

    fmt.Println(u.String())
    // https://httpbin.org/get?age=18&name=Tom

    resp, _ := http.Get(u.String())

    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)

    fmt.Println(string(body))

}

响应

{
  "args": {
    "age": "18", 
    "name": "Tom"
  }, 
  "headers": {
    "Accept-Encoding": "gzip", 
    "Host": "httpbin.org", 
    "User-Agent": "Go-http-client/2.0", 
    "X-Amzn-Trace-Id": "Root=1-6648641d-0567278a093ee36078e9da27"
  }, 
  "origin": "127.0.0.1", 
  "url": "https://httpbin.org/get?age=18&name=Tom"
}

3、POST请求提交Form表单

package main

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

func main() {
    targetUrl := "https://httpbin.org/post"

    data := url.Values{}
    data.Set("name", "Tom")
    data.Set("age", "18")

    resp, _ := http.PostForm(targetUrl, data)

    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)

    fmt.Println(string(body))
}

响应

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "age": "18", 
    "name": "Tom"
  }, 
  "headers": {
    "Accept-Encoding": "gzip", 
    "Content-Length": "15", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Go-http-client/2.0", 
    "X-Amzn-Trace-Id": "Root=1-66486446-48a3d6085e91c39208746892"
  }, 
  "json": null, 
  "origin": "127.0.0.1", 
  "url": "https://httpbin.org/post"
}

4、POST请求提交Json数据

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
)

func main() {
    targetUrl := "https://httpbin.org/post"

    data := make(map[string]interface{})
    data["name"] = "Tom"
    data["age"] = 12

    respdata, _ := json.Marshal(data)

    resp, _ := http.Post(targetUrl, "application/json", bytes.NewReader(respdata))
    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))

}

响应

{
  "args": {}, 
  "data": "{\"age\":12,\"name\":\"Tom\"}", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept-Encoding": "gzip", 
    "Content-Length": "23", 
    "Content-Type": "application/json", 
    "Host": "httpbin.org", 
    "User-Agent": "Go-http-client/2.0", 
    "X-Amzn-Trace-Id": "Root=1-6648646b-1057cc454774771009b19914"
  }, 
  "json": {
    "age": 12, 
    "name": "Tom"
  }, 
  "origin": "127.0.0.1", 
  "url": "https://httpbin.org/post"
}

5、接收响应数据,json转为map

package main

import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"
)

// 定义响应数据结构
type Result struct {
    Args    string            `json:"args"`
    Headers map[string]string `json:"headers"`
    Origin  string            `json:"origin"`
    Url     string            `json:"url"`
}

func main() {
    targetUrl := "https://httpbin.org/get"

    resp, _ := http.Get(targetUrl)
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))

    // 接收返回的数据
    var ret Result

    json.Unmarshal(body, &ret)
    fmt.Printf("%#v\n", ret)

}

响应数据json格式

{
  "args": {}, 
  "headers": {
    "Accept-Encoding": "gzip", 
    "Host": "httpbin.org", 
    "User-Agent": "Go-http-client/2.0", 
    "X-Amzn-Trace-Id": "Root=1-664854df-48710d487d9f9d97398586ac"
  }, 
  "origin": "127.0.0.1", 
  "url": "https://httpbin.org/get"
}

响应数据golang数据

main.Result{
    Args:"", 
    Headers:map[string]string{
        "Accept-Encoding":"gzip", 
        "Host":"httpbin.org", 
        "User-Agent":"Go-http-client/2.0", "X-Amzn-Trace-Id":"Root=1-664854df-48710d487d9f9d97398586ac"
    }, 
    Origin:"127.0.0.1", 
    Url:"https://httpbin.org/get"
}

6、自定义请求头

通过构建 Request 对象,设置请求头属性

package main

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

func main() {
	targetUrl := "http://httpbin.org/get"

	client := &http.Client{}
	req, _ := http.NewRequest("GET", targetUrl, nil)

	req.Header.Add("X-Token", "123456")
	req.Header.Add("X-UID", "666")

	resp, _ := client.Do(req)
	defer resp.Body.Close()

	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}

响应

{
  "args": {}, 
  "headers": {
    "Accept-Encoding": "gzip", 
    "Host": "httpbin.org", 
    "User-Agent": "Go-http-client/1.1", 
    "X-Amzn-Trace-Id": "Root=1-664863a4-044bd06c4e4887d73790591a", 
    "X-Token": "123456", 
    "X-Uid": "666"
  }, 
  "origin": "127.0.0.1"
  "url": "http://httpbin.org/get"
}

参考: Go实现 简单http请求(get ,post) 多种请求方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/633168.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu下交叉编译安卓FFmpeg 和 官方指导链接

将之前的编译方法在此记录 Linux系统:Ubuntu 18.04.6 LTS 交叉编译工具链:gcc-aarch64-linux-gnu gaarch64-linux-gnu ffmpeg版本:5.1.3 1.下载源码 ffmpeg官网:https://ffmpeg.org/download.html#releases 下载完成后&#x…

Yolov5保姆及入门-含源码【推荐】

前言 YOLO系列模型作为一种实时目标检测算法,自从YOLO1发布以来,就以其检测速度快、准确率高而受到广泛关注。随着技术的迭代,YOLO系列已经发展到了YOLO8。本文将详细介绍YOLO5的技术规格、应用场景、特点以及性能对比。 yolov5源码下载地址…

本地部署Terraria泰拉瑞亚私服并通过内网穿透生成公网地址远程联机

文章目录 前言1. 下载Terraria私服2. 本地运行Terraria 私服3. 本地Terraria私服连接4. Windwos安装Cpolar 工具5. 配置Terraria远程联机地址6. Terraria私服远程联机7. 固定远程联机地址8. 固定的联机地址测试 前言 本文将为你详细介绍在本地如何运行泰拉瑞亚本地私服和结合C…

5月23日学习记录

[CSAWQual 2019]Unagi 涉及:xxe漏洞,外来编码xml绕过 打开环境,发现存在文件上传 简单上传一个php 毫无疑问上传失败,说是存在waf,绕过waf才能上传,点击here看看 xml编码,可能存在xxe漏洞&…

Qt学习记录(十三)TCP通信,UDP通信 服务器和客户端

目录 前言: Linux下的TCP通信 QT下的TCP通信 服务器 ui 头文件 cpp文件 客户端 新建文件 ​编辑 ui 头文件.h cpp文件 现象 Linux下的UDP通信 QT下的UDP通信 ui 工程文件 头文件.h .cpp文件 现象 前言: 医疗猫猫!猫好&a…

宿舍管理系统--毕业设计

毕业设计💼MD5加密🔒SSM框架🎨Layui框架🎄 实现功能 管理员的登录与登出 管理员,班级,学生,宿舍,卫生,访客各模块增删改查 个别模块关联查询 各个模块数据导出Excel 一些截图

形态学操作:腐蚀、膨胀、开闭运算、顶帽底帽变换、形态学梯度区别与联系

一、总述相关概念 二、相关问题 1.形态学操作中的腐蚀和膨胀对图像有哪些影响? 形态学操作中的腐蚀和膨胀是两种常见的图像处理技术,它们通过对图像进行局部区域的像素值替换来实现对图像形状的修改。 腐蚀操作通常用于去除图像中的噪声和细小的细节&a…

three.js能实现啥效果?看过来,这里都是它的菜(05)

这是第五期了,本期继续分享three.js可以实现的3D动画案例,捎带讲一下如何将模型导入到three.js中。 如何将模型导入three.js中 three.js可以通过多种方式导入3D模型,以下是其中几种常见的方法: 使用three.js自带的OBJLoader或M…

【Kubernetes】kubectl详解

陈述式资源管理方法: 1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口 2.kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为 apiserver 能识别的…

UE5 双手握剑的实现(逆向运动学IK)

UE5 双手握剑的实现 IK 前言 什么是IK? UE官方给我们提供了很多对于IK处理的节点,比如ABRIK、Two Bone IK、Full Body IK 、CCD IK等,但是看到这,很多人就好奇了,什么是IK? 首先我们来看看虚幻小白人的骨…

yolov8训练自己数据集时出现loss值为nan。

具体原因目前暂未寻找到。 解决办法 将参数amp改成False即可。 相关资料: https://zhuanlan.zhihu.com/p/165152789 https://github.com/ultralytics/ultralytics/issues/1148

如何搭建一个vue项目(完整步骤)

搭建一个新的vue项目 一、安装node环境二、搭建vue项目环境1、全局安装vue-cli2、进入你的项目目录,创建一个基于 webpack 模板的新项目3、进入项目:cd vue-demo,安装依赖4、npm run dev,启动项目 三、vue项目目录讲解四、开始我们…

正点原子LWIP学习笔记(一)lwIP入门

lwIP入门 一、lwIP简介(了解)二、lwIP结构框图(了解)三、如何学习lwIP(熟悉) 一、lwIP简介(了解) lwIP是一个小型开源的TCP/IP协议栈 阉割的TCP/IP协议 TCP/IP协议栈结构&#xff0…

57. UE5 RPG 处理AI敌人转向以及拾取物品的问题

在上一篇文章中,我们实现了使用AI行为树控制敌人进行移动,它们可以一直跟随玩家,虽然现在还未实现攻击。但在移动过程中,我发现了有两个问题,第一个是敌人转向的时候很僵硬,可以说是瞬间转向的,…

【kubernetes】多 master 高可用集群架构部署

目录 前言 一、环境部署 二、master02 节点部署 1、拷贝相关文件 2、修改配置文件 3、启动各服务并设置开机自启 4、 查看node节点状态 三、负载均衡部署 1、部署 nginx 服务 1.1 编译安装 nginx 1.2 修改 nginx 配置文件 2、部署 keepalived 服务 2.1 yum安装 ke…

python打包exe,通过文件动态传参运行exe【拿来即用】

配置虚拟环境 安装包:pip install pipenv 创建虚拟环境:创建一个新文件夹,在此目录,打开cmd,输入:pipenv install, 进入虚拟环境:pipenv shell 安装所需的依赖包:pip in…

无人机监测系统:天空之眼,精准掌握地球脉动

在当今信息化快速发展的时代,无人机技术以其独特的优势,正在成为资源调查、环境监测和规划支持的重要工具。无人机监测系统通过搭载多种传感器和设备,能够快速、高效地获取地表信息,为决策提供科学依据。 项目背景 随着全球环境…

VScode解决报错“Remote-SSH XHR failed无法访问远程服务器“的方案

VScode解决报错"Remote-SSH XHR failed无法访问远程服务器"的方案 $ ls ~/.vscode-server/bin 2ccd690cbff1569e4a83d7c43d45101f817401dc稳定版下载链接:https://update.code.visualstudio.com/commit:COMMIT_ID/server-linux-x64/stable 内测版下载链接…

51建模网AR虚拟试用,让网购不再只靠想象!

在数字化的浪潮中,网购已成为现代人生活的一部分。然而,传统的网购模式常常因为无法直接试穿、试用商品,导致买家在收到商品后感到失望,特别是面对大件家居产品时,仅凭屏幕上的图片和尺寸描述,很难准确地把…

阿里云数据库 SelectDB 版全面商业化,开启现代化实时数据仓库的全新篇章

2024 年 5 月 21 日,由阿里云联合飞轮科技共同举办的「阿里云数据库 SelectDB 版商业化产品发布会」于线上召开。阿里巴巴集团副总裁、阿里云数据库产品事业部负责人李飞飞宣布,阿里云数据库 SelectDB 版在中国站及国际站全面发布,正式开启商…