当前位置: 首页 > 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…...

Unity游戏开发:如何用UniTask实现可撤销的异步流程(附完整代码)

Unity游戏开发&#xff1a;UniTask实现可撤销异步流程的工程实践 在游戏开发中&#xff0c;异步操作的管理一直是让开发者头疼的问题。想象这样一个场景&#xff1a;玩家在教学关卡中反复尝试某个操作&#xff0c;需要随时回退到上一步&#xff1b;或者在剧情分支选择时&#…...

Qwen2.5-Omni:多模态流式交互的Thinker-Talker架构与TMRoPE技术解析

1. Qwen2.5-Omni的核心设计理念 第一次接触Qwen2.5-Omni时&#xff0c;最让我惊讶的是它处理多模态数据的流畅程度。想象一下&#xff0c;你正在和AI助手讨论一段视频内容&#xff0c;它能同时理解画面中的物体、背景音乐的情绪&#xff0c;还能用自然语音回应你的问题——这就…...

如何快速将Blender模型导入Unreal Engine?免费Datasmith插件完整指南

如何快速将Blender模型导入Unreal Engine&#xff1f;免费Datasmith插件完整指南 【免费下载链接】bl_datasmith Blender addon to export UE4 Datasmith format 项目地址: https://gitcode.com/gh_mirrors/bl/bl_datasmith Blender Datasmith Export是一款开源免费的Bl…...

机器视觉中的坐标系转换:从像素到世界的无缝衔接

1. 机器视觉中的坐标系基础概念 第一次接触机器视觉时&#xff0c;最让我困惑的就是各种坐标系之间的关系。记得当时调试工业相机时&#xff0c;明明在图像上看到了目标物体&#xff0c;但机械臂就是抓不准位置。后来才发现&#xff0c;问题出在没有正确理解像素坐标系和世界坐…...

字节跳动“卷”到离谱!裸辞后我投身大模型风口,90天逆袭成“AI小子”!

个人自我介绍 鄙人出生于南方小乡镇&#xff0c;为了走出小镇&#xff0c;在当地够拼够努力&#xff0c;不是自夸&#xff0c;确确实实也算得上“别人家的小孩”&#xff0c;至少在学习这件事情少&#xff0c;没有要家里人操过心。 高考特别顺利&#xff0c;一个老牌985&#x…...

Java 新纪元 — JDK 25 + Spring Boot 4 全栈实战(十八):云原生部署——Docker + K8s + GraalVM Native Image,让Java真正飞在云端

系列导航 | ← 上一篇:D17 Boot 3 → Boot 4 迁移避坑指南 | 下一篇:D19 微服务:Boot 4 + Spring Cloud 2026.x → 适用读者:有Docker基础、正在或准备将Spring Boot应用部署到K8s的中高级开发者。 前置知识:Docker基础、Linux基础、了解K8s核心概念。 本文代码:GitHub G…...

VINS_Fusion轨迹评估实战:如何用evo工具搞定MH_01_easy数据集测试(附完整代码修改指南)

VINS_Fusion轨迹精度评估全流程&#xff1a;从数据准备到evo工具深度解析 1. 环境配置与工具准备 在开始评估VINS_Fusion的轨迹精度之前&#xff0c;我们需要确保开发环境已经正确配置。以下是必要的准备工作&#xff1a; 基础环境要求&#xff1a; Ubuntu 18.04/20.04 LTS&…...

RTX4090D优化版Qwen3-32B+OpenClaw:3小时搞定AI办公自动化

RTX4090D优化版Qwen3-32BOpenClaw&#xff1a;3小时搞定AI办公自动化 1. 为什么选择本地部署方案 去年冬天&#xff0c;当我第17次被飞书机器人返回的"API配额不足"提示打断工作流时&#xff0c;终于下定决心寻找替代方案。作为一个小型技术团队的负责人&#xff0…...

5分钟搞懂幂等矩阵:从定义到Python实现

5分钟搞懂幂等矩阵&#xff1a;从定义到Python实现 第一次听到"幂等矩阵"这个词时&#xff0c;我正坐在线性代数课的最后一排昏昏欲睡。教授在黑板上写下"AA"这个看似简单的等式时&#xff0c;我完全没意识到这个概念会在后来的机器学习项目中反复出现。今…...

如何用VarifocalNet提升目标检测性能?从FCOS到VFNet的实战解析

从FCOS到VFNet&#xff1a;实战解析VarifocalNet如何突破目标检测性能瓶颈 目标检测领域近年来涌现出大量创新算法&#xff0c;但性能提升逐渐进入平台期。传统方法如FCOS虽然简洁高效&#xff0c;但在处理密集物体和复杂场景时仍存在明显局限。本文将深入剖析VarifocalNet(VFN…...