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

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...