golang web开发获取get、post、cookie参数

2023-10-30

 

golang web开发获取get、post、cookie参数

在成熟的语言java、python、php要获取这些参数应该来讲都非常简单,过较新的语言golang用获取这些个参数还是费了不少劲,特此记录一下。

golang版本:1.3.1

 在贴代码之前如果能先理解一下golang http.request的三个属性Form、PostForm、MultipartForm应该能较好的理解代码,下面摘录一下。



 Form、PostForm、MultipartForm说明

 

简要说明一下

Form:存储了post、put和get参数,在使用之前需要调用ParseForm方法。
PostForm:存储了post、put参数,在使用之前需要调用ParseForm方法。
MultipartForm:存储了包含了文件上传的表单的post参数,在使用前需要调用ParseMultipartForm方法。

 

获取GET参数

网上比较常见的一个版本是:

r.ParseForm()
if len(r.Form["id"]) > 0 {
    fmt.Fprintln(w, r.Form["id"][0])
}

 

其中r表示*http.Request类型,w表示http.ResponseWriter类型。

r.Form是url.Values字典类型,r.Form["id"]取到的是一个数组类型。因为http.request在解析参数的时候会将同名的参数都放进同一个数组里,所以这里要用[0]获取到第一个。

这种取法在通常情况下都没有问题,但是如果是如下请求则无法取到需要的值:

<form action="http://localhost:9090/?id=1" method="POST">
    <input type="text" name="id" value="2" />
    <input type="submit" value="submit" />
</form>

 因为r.Form包含了get和post参数,并且以post参数为先,上例post参数和get参数都有id,所以应当会取到post参数2。虽然这种情况并不多见,但是从严谨的角度来看程序上还是应当处理这种情况。立马补上改进代码:

queryForm, err := url.ParseQuery(r.URL.RawQuery)
if err == nil && len(queryForm["id"]) > 0 {
    fmt.Fprintln(w, queryForm["id"][0])
}

 

代码比较简单,就是分析url问号后的参数。事实上这个也是标准库ParseForm中关于get参数解析代码。

 

获取POST参数

这里要分两种情况:

        普通的post表单请求,Content-Type=application/x-www-form-urlencoded
        有文件上传的表单,Content-Type=multipart/form-data

 

第一种情况比较简单,直接用PostFormValue就可以取到了。

fmt.Fprintln(w, r.PostFormValue("id"))

 

第二种情况复杂一些,如下表单:

<form action="http://localhost:9090" method="POST" enctype="multipart/form-data">
    <input type="text" name="id" value="2" />
    <input type="file" name="pic" />
    <input type="submit" value="submit" />
</form>

 

因为需要上传文件,所以表单enctype要设置成multipart/form-data。此时无法通过PostFormValue来获取id的值,因为golang库里还未实现这个方法:



 

幸好golang中可以提供了另外一个属性MultipartForm来处理这种情况。

r.ParseMultipartForm(32 << 20)
if r.MultipartForm != nil {
    values := r.MultipartForm.Value["id"]
    if len(values) > 0 {
        fmt.Fprintln(w, values[0])
    }
}

 

 

获取COOKIE参数

cookie, err := r.Cookie("id")
if err == nil {
    fmt.Fprintln(w, "Domain:", cookie.Domain)
    fmt.Fprintln(w, "Expires:", cookie.Expires)
    fmt.Fprintln(w, "Name:", cookie.Name)
    fmt.Fprintln(w, "Value:", cookie.Value)
}

 

 

r.Cookie返回*http.Cookie类型,可以获取到domain、过期时间、值等数据。

 

 

小结

在折腾的过程中看了下net/http包中的源码,感觉在web开发中还是有很多不完善的地方。作为使用者来讲,最希望就是直接通过一个方法取到相应的值就可以了,期待官方团队尽早完善。

转载请注明:快乐编程 » golang web开发获取get、post、cookie参数

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

golang web开发获取get、post、cookie参数 的相关文章

  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

    我有一个清单 things A1 B2 C3 我有一个 pandas 数据框 其中有一列包含用分号分隔的值 某些行将包含与上面列表中的一项的匹配 它不会是完美的匹配 因为它在其中包含字符串的其他部分 该列 例如 该列中的一行可能有 哇 这里
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • 当玩家触摸屏幕一侧时,如何让 pygame 发出警告?

    我使用 pygame 创建了一个游戏 当玩家触摸屏幕一侧时 我想让 pygame 给出类似 你不能触摸屏幕两侧 的错误 我尝试在互联网上搜索 但没有找到任何好的结果 我想过在屏幕外添加一个方块 当玩家触摸该方块时 它会发出警告 但这花了很长
  • Geopandas 设置几何图形:MultiPolygon“等于 len 键和值”的 ValueError

    我有 2 个带有几何列的地理数据框 我将一些几何图形从 1 个复制到另一个 这对于多边形效果很好 但对于任何 有效 多多边形都会返回 ValueError 请指教如何解决这个问题 我不知道是否 如何 为什么应该更改 MultiPolygon
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • Python - 在窗口最小化或隐藏时使用 pywinauto 控制窗口

    我正在尝试做的事情 我正在尝试使用 pywinauto 在 python 中创建一个脚本 以在后台自动安装 notepad 隐藏或最小化 notepad 只是一个示例 因为我将编辑它以与其他软件一起使用 Problem 问题是我想在安装程序
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • 通过数据框与函数进行交互

    如果我有这样的日期框架 氮 EG 00 04 NEG 04 08 NEG 08 12 NEG 12 16 NEG 16 20 NEG 20 24 datum von 2017 10 12 21 69 15 36 0 87 1 42 0 76
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 对输入求 Keras 模型的导数返回全零

    所以我有一个 Keras 模型 我想将模型的梯度应用于其输入 这就是我所做的 import tensorflow as tf from keras models import Sequential from keras layers imp
  • 如何从父类中获取子类名

    我试图在不需要子类上的函数的情况下完成此任务 这可能吗 我有一种感觉 但我真的很想确定
  • 循环标记时出现“ValueError:无法识别的标记样式 -d”

    我正在尝试编码pyplot允许不同标记样式的绘图 这些图是循环生成的 标记是从列表中选取的 为了演示目的 我还提供了一个颜色列表 版本是Python 2 7 9 IPython 3 0 0 matplotlib 1 4 3 这是一个简单的代
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording

随机推荐

  • MySQL基础学习(四)——SQL语句之DML语句

    前言 上一篇博客介绍了一下SQL语句中的DDL和DCL语句 主要涉及通过SQL赋予或者撤回相关的用户权限 创建数据表 创建索引等内容 这一篇博客开始总结DML语句 就是我们开发中常用的一些select insert update delet
  • C#常见编程

    1 编写一段程序 运行时向用户提问 你考了多少分 0 100 接受输入后判断其等级并显示出来 判断依据如下 等级 优 90 100分 良 80 89分 中 60 69分 差 0 59分 static void Main string arg
  • 合并两个有序链表(easy)

    将两个升序链表合并为一个新的 升序 链表并返回 新链表是通过拼接给定的两个链表的所有节点组成的 示例 1 输入 l1 1 2 4 l2 1 3 4 输出 1 1 2 3 4 4 示例 2 输入 l1 l2 输出 示例 3 输入 l1 l2
  • 【Golang源码学习】chromedp篇

    GitHub https github com chromedp chromedp chromedp go RunResponse 官方注释 func RunResponse ctx context Context actions Acti
  • WKWebView之离线加载以及遇到的问题

    目录 前言 一 离线包是什么 二 方案调研 NSURLProtocol WKURLSchemeHandler 三 具体实施 1 离线包的分发 2 服务器对请求接口处理 3 客户端下载离线包 4 webview设置拦截 5 WKURLSche
  • Typcho反序列化漏洞分析

    Typcho反序列化漏洞分析 文章首发 https xz aliyun com t 9428 影响范围 2017年10月24日之前的所有版本 环境搭建 下载地址 http typecho org 这里主要是说下 在intall之前 需要我们
  • Linux Ubuntu搭建Git服务器

    之前介绍过如何在Windows上搭建Git仓库服务器 不过服务器用的比较多的还是Linux 因为便宜 同一个VPS商一般来说Linux比Windows便宜 没有图形界面 低配置VPS的也可以跑动Linux 开源免费 我感觉比较灵活 下载源也
  • 创建对象的五种方式

    1 使用new关键字 gt 调用构造函数 2 使用Class的newInstance方法 gt 调用构造函数 3 使用Constructor的newInstance方法 gt 调用构造函数 4 使用clone方法 gt 没有调用构造函数 5
  • Oracle中的触发器(trigger)

    1 触发器的定义 数据库触发器是一个与表相关联 存储PL SQL语句的 东西 每当一个特定的数据操作语句 insert update delete 在指定的表上发出时 Oracle自动执行触发器中定义的语句序列 例如 当员工信息插入后 自动
  • java基于winbox 工具下使用 api获取映射表api数据

    Winbox 是基于 windows下远程管理 ROS的软件 提供直观方便的图形界面 用它能登陆路由器 这个路由器是软路由ROUTEOS制作的 用Winbox登陆后 就可以配置路由器了 用这个软件便于配置路由器 Winbox控制台使用TCP
  • 如何利用今日头条极速版挣点小钱

    红包 1元现金速撸 红包 下载 今日头条极速版 进入 任务 填邀请码 1386552161 即可立即提现1元到支付宝 每天阅读 睡觉 签到 走路都有钱领
  • C++类和对象——(对象的赋值拷贝构造函数)

    目录 对象的赋值 目录 对象的赋值 1 提出问题 2 解决办法 拷贝构造函数 1 拷贝构造函数的原型 2 调用机制 3 使用例程代码 总代码工程 对象的赋值 1 提出问题 能否使用一个已经构造好的对象去初始化另一个对象 C 编译器又是如何处
  • 明日方舟服务器不稳定,《明日方舟》服务器恢复正常 补偿玩家400玉+40理智

    原标题 明日方舟 服务器恢复正常 补偿玩家400玉 40理智 此前我们曾报道 明日方舟 进不去 登微博热搜 官方表示正在紧急修复 现在 明日方舟 官方表示之前出现的问题已于18 00完成相关修复并已逐步恢复正常 将为受波及的玩家发放400合
  • Java 创建文件,文件夹不存在时,如何创建

    创建文件 String url C Users yz Desktop test new File String format s s s url test txt createNewFile 如果文件夹路径不存在则会报如下错误 正确代码 S
  • C++学习(四八三)无法从“std::pair<const _Kty,_Ty>”转换为“_Objty”

    使用vs2017编译osgEarth2 9的FeatureSourceIndexNode cpp遇到的 使用VS2017编译osgEarth2 7过程中遇到问题总结 justslowdown going的博客 CSDN博客 gt gt xm
  • 去除快捷方式箭头_桌面快捷方式小箭头去除与恢复方法

    电脑桌面的快捷方式图标默认都带有小箭头 不知道是不是自己心情不好 总之越看越不爽 今天我将出一期教程专门对付这个小箭头 去除或者保留 由我做主 去除小箭头方法 方法一 1 在键盘上按 win R 输入 regedit 点击 确定 2 鼠标右
  • WPF 样式 Style 封装

    从上面截图可以看出有三个圆形的 Button 他们的大小和鼠标悬停的效果一样 只是颜色各有不同 所以在实际的开发过程中最好是能够将样式模板封装起来 这样做减少了代码冗余 在开发过程中 如有相同的按钮样式实现直接应用就可以了 后期也利于阅读和
  • samba3.0 详细配置实例

    现在做了部分改动 并添加了mysql虚拟用户 还有补充了samba中批量增加用户的脚本 Samba3 0服务器实战调试 Centos5预装的samba已经是Samba版本3 0 23c 功能已经非常强大了 今天我们调试的重点不是samba3
  • Messari:21年第二季度Web3及NFT报告

    注 原文来自Messari 以下为全文编译 如果今年年初 有人走到我面前说 NFT的销售额将轻松超过10亿美元 GaryVee将推出NFT项目 Axie Infinity将成为五大NFT市场之一 我会回答 我会相信其中之一 但是 过去的一个
  • golang web开发获取get、post、cookie参数

    golang web开发获取get post cookie参数 在成熟的语言java python php要获取这些参数应该来讲都非常简单 过较新的语言golang用获取这些个参数还是费了不少劲 特此记录一下 golang版本 1 3 1