当前位置: 首页 > news >正文

golang web笔记-2.请求request

什么是request

        http消息分为request(请求) 和 response(响应)

        request:在go中是一个struct,代表了客户段发送的http请求,已可以通过request 的方法访问请求中的cookie、URL、User Agent,查询字符串等信息。

Request Header

        请求和响应的headers是通过Header来描述的,它是一个map,用来表示Http Header里的Key-Value.

        获取Header

        request.Header:获取整个haeder的map信息

        request.Header["{key}"] :获取header中的指定key的value的切片

        request.Header.Get("{key}") :返回获取header中的指定key的value字符传,多个值以逗号分隔

import ("fmt""net/http"
)func main() {server := http.Server{Addr: "localhost:8080",}http.HandleFunc("/test", func(writer http.ResponseWriter, request *http.Request) {fmt.Println(request.Header)fmt.Println(request.Header["Accept-Encoding"])fmt.Println(request.Header.Get("Accept-Encoding"))})server.ListenAndServe()
}

处理请求参数

get请求处理

request.URL.RawQuery:获取参数字符串。
request.URL.Query():获取请求参数字符串对应的map[String][]String,值为切片的原因是key有可能重复。
request.URL.Query("{key}"):获取对应请求参数的第一个值。
package mainimport ("fmt""net/http"
)func main() {server := http.Server{Addr: "localhost:8080",}http.HandleFunc("/test", func(writer http.ResponseWriter, request *http.Request) {//request.URL.RawQuery:获取参数字符串query := request.URL.RawQueryfmt.Println(query)//request.URL.Query():获取请求参数字符串对应的map[String][]String,值为切片的原因是key有可能重复values := request.URL.Query()fmt.Println(values)//request.URL.Query("{key}"):获取对应请求参数的第一个值get := request.URL.Query().Get("name")fmt.Println(get)writer.Write([]byte("请求成功"))})server.ListenAndServe()
}

 

form表单请求处理

请求包含的内容

        html表单中的数据会以name-value对的形式,如果通过get请求,数据通过url的name-value来发送,如果post请求发送,数据内容放在post请求的body中,name-value数据格式可以通过表单的Content Type指定,也就是enctype

enctype的值如下:

  • application/x-www-form-urlencoded:默认值,表单数据编码到请求字符串里面,适用于文本请求
  • multipart/form-data:每一对name-value都会转换为MIME消息部分,每一部分都有自己的Content Type 和Content Disposition,适用大量数据,例如上传文件
  • text/plain:html5浏览器需要支持的内容

不同请求对应的处理

        Request允许我们从URL或/和Body中提取请求数据,先调用ParseForm 或者 parseMultipartForm 解析Request,然后在访问相应的Form、PostForm、MultipartForm获取数据

<html><title>测试表单请求</title><body><form action="http://localhost:8080/test?first_name=urlData" method="post" enctype="application/x-www-form-urlencoded"><input type="text" name="first_name" /><br /><input type="text" name="last_name" /><br /><input type="submit" value="提交"/></form></body>
</html>
package mainimport ("fmt""net/http"
)func main() {server := http.Server{Addr: "localhost:8080",}http.HandleFunc("/test", func(writer http.ResponseWriter, request *http.Request) {//先调用 request.ParseForm 解析request,再获取from数据-request.Form/request.PostFormrequest.ParseForm()fmt.Fprintln(writer, request.Form)fmt.Fprintln(writer, request.PostForm)})server.ListenAndServe()
}

 第二行比第一行返回中少了url中first_name的值

Form:request.Form,返回map格式的参数信息,如果url中有和表单中相同的key,表单数据在前,url中数据在后

PostForm: request.PostForm,只获取表单中的数据

MultipartForm:对应from表单中的enctype = multipart/form-data需要先调用parseMultipartForm解析请求,会返回一个struct,struct有两个map,第一个map是from表单中的数据,第二个map是上传的文件。

<html><title>测试表单请求</title><body><form action="http://localhost:8080/test?first_name=urlData" method="post" enctype="multipart/form-data"><input type="text" name="first_name" /><br /><input type="text" name="last_name" /><br /><input type="file" name="myFile"/><br /><input type="submit" value="提交"/></form></body>
</html>
package mainimport ("fmt""net/http"
)func main() {server := http.Server{Addr: "localhost:8080",}http.HandleFunc("/test", func(writer http.ResponseWriter, request *http.Request) {request.ParseMultipartForm(1024)fmt.Fprintln(writer, request.MultipartForm)})server.ListenAndServe()
}

FormValue:获取form字段中指定的key对应的第一个。
valuePostFormValue:获取form字段中指定的key对应的第一个value,只能获取到form表单中的值
FormValue 和 PostFormValue无需在调用parseForm/ ParseMultipartForm
package mainimport ("fmt""net/http"
)func main() {server := http.Server{Addr: "localhost:8080",}http.HandleFunc("/test", func(writer http.ResponseWriter, request *http.Request) {v1 := request.FormValue("first_name")v2 := request.FormValue("last_name")v3 := request.PostFormValue("first_name")v4 := request.PostFormValue("last_name")fmt.Println(v1)fmt.Println(v2)fmt.Println(v3)fmt.Println(v4)})server.ListenAndServe()
}

上传文件

       1.请求的enctype应为"multipart/form-data"

       2.解析request请求:request.ParseMultipartForm(1024)

        3.获取文件:request.MultipartForm.File["myFile"][0]:myFile对应请求的file的key,[0]获取第一个文件

<html><title>测试表单请求</title><body><form action="http://localhost:8080/test?first_name=urlData" method="post" enctype="multipart/form-data"><input type="text" name="first_name" /><br /><input type="text" name="last_name" /><br /><input type="file" name ="myFile"/><br /><input type="submit" value="提交"/></form></body>
</html>
package mainimport ("fmt""io/ioutil""net/http"
)func main() {server := http.Server{Addr: "localhost:8080",}http.HandleFunc("/test", func(writer http.ResponseWriter, request *http.Request) {request.ParseMultipartForm(1024)fileHeader := request.MultipartForm.File["myFile"][0]file, err := fileHeader.Open()if err == nil {data, err := ioutil.ReadAll(file)if err == nil {fmt.Println(string(data))}}})server.ListenAndServe()
}

Json请求

读取json

1.使用解码器:dec :=  json.NewDecoder(request.Body)

2.在解码器上进行解码:err := dec.Decode(&struct的实例)

写入json

使用编码器 enc := json.NewEncoder(writer)

编码:err = enc.Encode(struct的实例)

package mainimport ("encoding/json""fmt""net/http"
)func main() {server := http.Server{Addr: "localhost:8080",}http.HandleFunc("/test", func(writer http.ResponseWriter, request *http.Request) {// 读取json// 1.解码dec := json.NewDecoder(request.Body)// 1.转换为结构体company := Company{}err := dec.Decode(&company)//3.打印数据if err == nil {fmt.Println(company)}// 返回json//1.获取编码器enc := json.NewEncoder(writer)//2.对struct编码err = enc.Encode(company)if err == nil {//3.向请求输出jsonwriter.WriteHeader(http.StatusInternalServerError)return}})server.ListenAndServe()
}/*
创建和json结构一致的 struct
{"id":1,"name":"xiaoqiang","country":"China"}
*/
type Company struct {ID      int    `json:"id"`Name    string `json:"name"`Country string `json:"country"`
}

相关文章:

golang web笔记-2.请求request

什么是request http消息分为request&#xff08;请求&#xff09; 和 response&#xff08;响应&#xff09; request&#xff1a;在go中是一个struct&#xff0c;代表了客户段发送的http请求&#xff0c;已可以通过request 的方法访问请求中的cookie、URL、User Agent&#xf…...

docker的安装与启动——配置国内Docker源

移除旧版本docker sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 配置docker yum源。 sudo yum install -y yum-utils sudo yum-config-manager –add-repo ht…...

httpsok-v1.17.0-SSL通配符证书自动续签

&#x1f525;httpsok-v1.17.0-SSL通配符证书自动续签 介绍 httpsok 是一个便捷的 HTTPS 证书自动续签工具&#xff0c;基于全新的设计理念&#xff0c;专为 Nginx 、OpenResty 服务器设计。已服务众多中小企业&#xff0c;稳定、安全、可靠。 一行命令&#xff0c;一分钟轻…...

相机、镜头参数详解以及相关计算公式

一、工业相机参数 1、分辨率 相机每次采集图像的像素点数&#xff0c;也是指这个相机总共有多少个感光晶片。在采集图像时&#xff0c;相机的分辨率对检测精度有很大的影响&#xff0c;在对同样打的视场成像时&#xff0c;分辨率越高&#xff0c;对细节的展示越明显。 相机像素…...

【微服务】组件、基础工程构建(day2)

组件 服务注册和发现 微服务模块中&#xff0c;一般是以集群的方式进行部署的&#xff0c;如果我们调用的时候以硬编码的方式&#xff0c;那么当服务出现问题、服务扩缩容等就需要对代码进行修改&#xff0c;这是非常不好的。所以微服务模块中就出现了服务注册和发现组件&…...

ESP32微信小程序SmartConfig配网

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 ESP32&微信小程序SmartConfig配网 前言一、SmartConfig是什么&#xff1f;二、使用乐鑫官方的smart_config例子1.运行照片 三、微信小程序总结 前言 本人是酷爱ESP32S3这…...

【PostgreSQL】提高篇——深入了解不同类型的 JOIN(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN)应用操作

1. JOIN 的基础概念 在 SQL 中&#xff0c;JOIN 是用于从两个或多个表中组合行的操作。JOIN 允许我们根据某些条件将表中的数据关联在一起。常见的 JOIN 类型包括&#xff1a; INNER JOIN&#xff1a;仅返回两个表中满足连接条件的行。LEFT JOIN&#xff08;或 LEFT OUTER JO…...

师生健康信息管理:SpringBoot技术突破

第4章 系统设计 4.1 系统体系结构 师生健康信息管理系统的结构图4-1所示&#xff1a; 图4-1 系统结构 登录系统结构图&#xff0c;如图4-2所示&#xff1a; 图4-2 登录结构图 师生健康信息管理系统结构图&#xff0c;如图4-3所示。 图4-3 师生健康信息管理系统结构图 4.2…...

【完-网络安全】Windows注册表

文章目录 注册表启动项及常见作用五个根节点常见入侵方式 注册表 注册表在windows系统的配置和控制方面扮演了一个非常关键的角色&#xff0c;它既是系统全局设置的存储仓库&#xff0c;也是每个用户的设置信息的存储仓库。 启动项及常见作用 快捷键 WinR打开运行窗口&#x…...

车辆重识别(2021NIPS在图像合成方面,扩散模型打败了gans网络)论文阅读2024/10/01

本文在架构方面的创新&#xff1a; ①增加注意头数量&#xff1a; 使用32⇥32、16⇥16和8⇥8分辨率的注意力&#xff0c;而不是只使用16⇥16 ②使用BigGAN残差块 使用Big GAN残差块对激活进行上采样和下采样 ③自适应组归一化层 将经过组归一化操作后的时间步和类嵌入到每…...

掌控物体运动艺术:图扑 Easing 函数实践应用

现如今&#xff0c;前端开发除了构建功能性的网站和应用程序外&#xff0c;还需要创建具有吸引力且尤为流畅交互的用户界面&#xff0c;其中动画技术在其中发挥着至关重要的作用。在数字孪生领域&#xff0c;动画的应用显得尤为重要。数字孪生技术通过精确模拟现实世界中的对象…...

Python从入门到高手4.2节-掌握循环控制语句

目录 4.2.1 理解循环控制 4.2.2 for循环结构 4.2.3 循环结构的else语句 4.2.4 while循环结构 4.2.5 循环结构可以嵌套 4.2.6 国庆节吃好玩好 4.2.1 理解循环控制 我们先来搞清楚循环的含义。以下内容引自汉语词典: 循环意指往复回旋&#xff0c;指事物周而复始地运动或变…...

CSS 中的overscroll-behavior属性

overscroll-behavior 是 CSS 中的一个属性&#xff0c;它用于控制元素在发生滚动时&#xff0c;当滚动范围超出其边界时的行为。这个属性对于改善用户体验特别有用&#xff0c;尤其是在移动端设备上&#xff0c;当用户尝试滚动一个已经达到滚动极限的元素时&#xff0c;可以通过…...

GPT对话知识库——在STM32的平台下,通过SPI读取和写入Flash的步骤。

目录 1&#xff0c;问&#xff1a; 1&#xff0c;答&#xff1a; 步骤概述 步骤 1&#xff1a;SPI 初始化 步骤 2&#xff1a;Flash 初始化&#xff08;可选&#xff09; 步骤 3&#xff1a;发送读取命令 示例&#xff1a;发送读取数据命令 步骤 4&#xff1a;读取数据…...

Pytorch基本知识

model.state_dict()、model.parameters()和model.named_parameters()的区别 parameters()只包含模块的参数,即weight和bias(包括BN的)。 named_parameters()返回包含模块名和模块的参数的列表,列表的每个元素均是包含layer name和layer param的元组。layer param就是param…...

vue3使用Teleport 控制台报警告:Invalid Teleport target on mount: null (object)

Failed to locate Teleport target with selector “.demon”. Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree main.…...

使用产品前的环境搭建

对于想学习编程的朋友们&#xff0c;使用本产品解决日常功能需求的同时会对自己编程能力具有较大帮助和提升。 目录 环境搭建 前言&#xff1a; 安装python 安装vscode 下载安装Anaconda 通过conda配置python环境 创建虚拟环境 查看环境是否创建成功 激活环境 安装pyt…...

JAVA基础语法 day07

一、final关键字 1.1final的基础知识 用来修饰类&#xff0c;方法&#xff0c;变量 final修饰类&#xff0c;该类被称为终极类&#xff0c;不能被继承了 final修饰方法&#xff0c;该方法称为终极方法&#xff0c;不能被重写了 final修饰变量&#xff0c;该变量仅能被赋值…...

ZLMediaKit编译运行

ZLMediaKit-github官网 快速开始 代码依赖与版权声明 MediaServer支持的HTTP MediaServer支持的HTTP HOOK API cd ZLMediaKit mkdir build cd build cmake … && make -j20 cd ZLMediaKit/release/linux/Debug ./MediaServer //./MediaServer -h 查看 //./MediaSe…...

AlmaLinux 9 安装mysql8.0.38

文件下载 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.39-linux-glibc2.12-x86_64.tar 选择合适系统版本 下载后解压 tar -xvf mysql-8.0.39-linux-glibc2.12-x86_64.tar解压后里面有三个文件夹 使用mysql-8.0.39-linux-glibc2.12-x86_64.tar.xz即可&#xff0c…...

NLP任务之文本分类(情感分析)

目录 1 加载预训练模型对应的分词器 2 加载数据集 3 数据预处理 4 构建数据加载器DataLoader 5 定义下游任务模型 6 测试代码 7 训练代码 #做&#xff08;中文与英文的&#xff09;分类任务&#xff0c;Bert模型比较合适&#xff0c;用cls向下游任务传输数…...

MIMO 2T4R BBU RHUB AAU

MIMO&#xff08;Multiple-Input Multiple-Output&#xff0c;多输入多输出&#xff09;是一种无线通信技术&#xff0c;它通过在发射端和接收端使用多个天线来提高数据传输速率和信号质量。"2T4R"是MIMO技术中的一种配置&#xff0c;其中"2T"代表有两个发…...

图说数集相等定义表明“R各元x的对应x+0.0001的全体=R“是几百年重大错误

黄小宁 设集A&#xff5b;x&#xff5d;表A各元均由x代表&#xff0c;&#xff5b;x&#xff5d;中变量x的变域是A。其余类推。因各数x可是数轴上点的坐标故x∈R变为实数yx1的几何意义可是&#xff1a;一维空间“管道”g内R轴上的质点x∈R(x是点的坐标)沿“管道”g平移变为点y…...

只出现一次的数字|||(考察点为位操作符)

目录 一题目&#xff1a; 二思路汇总&#xff1a; 三代码解答&#xff1a; 一题目&#xff1a; leetcode原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二思路汇总&#xff1a; 思路&#xff1a;如果直接对数组按位异或&#xff0c;那么最后得到的是a^b&a…...

PMP--三模--解题--81-90

文章目录 13.干系人管理--权力利益方格--基于干系人的职权级别&#xff08;权力&#xff09;、对项目成果的关心程度&#xff08;利益&#xff09;、对项目成果的影响能力&#xff08;影响&#xff09;&#xff0c;或改变项目计划或执行的能力&#xff0c;每一种方格都可用于对…...

脚本自动化创建AWS EC2实例+安装ElasticSearch和Kibana+集成OpenTelemetry监控

文章目录 为什么要通过脚本来部署服务器&#xff1f;EC2实例类型硬件选择实例类型的选择内存CPU存储架构操作系统最终的选择 其他配置安全组配置网络配置IAM RoleKey Pair内部域名 书写自动化脚本属性文件EBS配置文件创建EC2实例命令user data 文件OpenTelemetry监控 创建内部域…...

【设计模式-命令】

定义 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将请求封装为一个对象&#xff0c;从而使您能够使用不同的请求、排队请求或记录请求&#xff0c;并支持可撤销的操作。该模式通过将请求与其执行分离&#xff0c;使得请求者和接收者之间…...

【API安全】crAPI靶场全解

目录 BOLA Vulnerabilities Challenge 1 - Access details of another user’s vehicle Challenge 2 - Access mechanic reports of other users Broken User Authentication Challenge 3 - Reset the password of a different user Excessive Data Exposure Challenge …...

HCIP-HarmonyOS Application Developer 习题(四)

1、以下哪个Harmonyos的AI能力可以提供文档翻拍过程中的辅助增强功能? A.文档检测矫正 B.通用文字识别 C.分词 D.图像超分辨率 答案&#xff1a;A 分析&#xff1a;文档校正提供了文档翻拍过程的辅助增强功能&#xff0c;包含两个子功能&#xff1a; 文档检测&#xff1a;能够…...

【Python报错已解决】TypeError: ‘int‘ object is not subscriptable

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

做网站 怎么赚钱吗/爱战网关键词挖掘查询工具

〇、摘要 munin是用于Linux系统&#xff08;也可以监控windows系统&#xff09;的监控软件。munin除了可以监控系统的各项数值之外&#xff0c;最大的好处是可以自己编写插件自定义监控需要的数值。整个系统的架构简单明了&#xff0c;操作方便。如果是使用Debian或者Ubuntu安装…...

网站制作基础教程/专业代写软文

使用场景 跳表&#xff08;Skiplist&#xff09;是一个特殊的链表&#xff0c;相比一般的链表&#xff0c;有更高的查找效率&#xff0c;可比拟二叉查找树&#xff0c;平均期望的查找、插入、删除时间复杂度都是O(logn)&#xff0c;许多知名的开源软件&#xff08;库&#xff…...

临汾网站建设 吕梁网站建设/开鲁网站seo免费版

默认情况下&#xff0c;Java类的反射对象并未包含方法入参的名称&#xff0c;如果编译时打开debug开关&#xff08;javac-debugno&#xff09;&#xff0c;则方法入参名也会记录到类的反射对象中&#xff0c;所有如果PathVariable注解后面不指定参数的时候&#xff0c;要使方法…...

网站建设用什么语言开发/产品推广软文

juery传统轮播 css&#xff1a; html&#xff1a; js&#xff1a;...

网站建设和网络推广是干嘛/电商网站对比

Springboot与jdbc&&数据源Druid 目录结构如下&#xff1a; 使用Maven构建的项目&#xff0c;我们需要在pom文件中加入mysql驱动的依赖、SpringBoot-jdbc的依赖、druid的依赖还有两个基本的SpringBoot依赖&#xff1a;spring-boot-starter-web和spring-boot-starter-…...

网站制作经典案例/电脑培训速成班多少钱

这篇笔记是一篇安装教程&#xff0c;没有什么实际的意义&#xff0c;仅为了记录一下……距离上次弄这东西不知道多长时间了&#xff0c;以至于这次再次使用时很是生疏&#xff0c;于是就想着把过程记录下来方便之后查看。 这里不涉及VMware Workstation 15 Pro的安装。仅为如何…...