golang web开发获取get、post、cookie参数
在成熟的语言java、python、php要获取这些参数应该来讲都非常简单,过较新的语言golang用获取这些个参数还是费了不少劲,特此记录一下。
golang版本:1.3.1
在贴代码之前如果能先理解一下golang http.request的三个属性Form、PostForm、MultipartForm应该能较好的理解代码,下面摘录一下。
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中不能用PostForm获取post参数
golang中不能用PostForm获取post参数
幸好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、过期时间、值等数据。
golang web开发获取get、post、cookie参数的更多相关文章
- 基于gin的golang web开发:认证利器jwt
JSON Web Token(JWT)是一种很流行的跨域认证解决方案,JWT基于JSON可以在进行验证的同时附带身份信息,对于前后端分离项目很有帮助. eyJhbGciOiJIUzI1NiIsInR5 ...
- 基于gin的golang web开发:路由
Gin是一个用Golang编写的HTTP网络框架.它的特点是类似于Martini的API,性能更好.在golang web开发领域是一个非常热门的web框架. 启动一个Gin web服务器 使用下面的 ...
- 基于gin的golang web开发:路由二
在基于gin的golang web开发:路由中我们介绍了Gin的路由和一些获取链接中参数的方法,本文继续介绍其他获取参数的方法. 文件上传 在web开发中文件上传是一个很常见的需求,下面我们来看一下基 ...
- 基于gin的golang web开发:模型绑定
在前两篇文章介绍路由的时候,我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数.参数不多的情况下也很好用,但是想想看,如果接口有很多个参 ...
- 基于gin的golang web开发:模型验证
Gin除了模型绑定还提供了模型验证功能.你可以给字段指定特定的规则标签,如果一个字段用binding:"required"标签修饰,在绑定时该字段的值为空,那么将返回一个错误.开发 ...
- 基于gin的golang web开发:mysql增删改查
Go语言访问mysql数据库需要用到标准库database/sql和mysql的驱动.标准库的Api使用比较繁琐这里再引入另一个库github.com/jmoiron/sqlx. go get git ...
- 基于gin的golang web开发:服务间调用
微服务开发中服务间调用的主流方式有两种HTTP.RPC,HTTP相对来说比较简单.本文将使用 Resty 包来实现基于HTTP的微服务调用. Resty简介 Resty 是一个简单的HTTP和REST ...
- 基于gin的golang web开发:实现用户登录
前文分别介绍过了Resty和gin-jwt两个包,Resty是一个HTTP和REST客户端,gin-jwt是一个实现了JWT的Gin中间件.本文将使用这两个包来实现一个简单的用户登录功能. 环境准备 ...
- 基于gin的golang web开发:中间件
gin中间件(middleware)提供了类似于面向切面编程或路由拦截器的功能,可以在请求前和请求之后添加一些自定义逻辑.实际开发中有很多场景会用到中间件,例如:权限验证,缓存,错误处理,日志,事务等 ...
随机推荐
- Python Socket编程初探
python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参 ...
- 使用springboot遇到的的异常
Unregistering JMX-exposed beans on shutdown <dependency> <groupId>org.springframework.bo ...
- oracle中的一些基本概念
Oracle数据库的物理文件是存储在磁盘上的数据文件.控制文件和日志文件的总称.数据文件和日志文件是数据库中最重要的文件.数据库由若干个表空间组成,表空间由表组成,表由段组成,段由区间组成,区间由数据 ...
- Android 数据加密算法 Des,Base64详解
一,DES加密: 首先网上搜索了一个DES加密算法工具类: import java.security.*;import javax.crypto.*; public class DesHelper { ...
- Linux中断 - IRQ number和中断描述符
一.前言 本文主要围绕IRQ number和中断描述符(interrupt descriptor)这两个概念描述通用中断处理过程.第二章主要描述基本概念,包括什么是IRQ number,什么是中断描述 ...
- DB2中三个有关锁变量DB2_EVALUNCOMMITTED,DB2_SKIPDELETED和DB2_SKIPINSERTED的使用
本文主要解释下DB2中三个有关锁变量DB2_EVALUNCOMMITTED,DB2_SKIPDELETED和DB2_SKIPINSERTED的使用 实验环境: DB2 v9.7.0.6 AIX 6.1 ...
- 【iOS开发-56】案例BUG:button的enabled、控件的userInteractionEnabled以及两种提示框UIAlert和UIActionSheet
接上述案例找BUG:[iOS开发-51]案例学习:动画新写法.删除子视图.视图顺序.延迟方法.button多功能使用方法及icon图标和启动页设置 (1)BUG:答案满了就不能再点击optionbut ...
- PHP的cURL快速入门 (小偷采集程序)
cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.很多小偷程序都是使用这个函数. 最爽的是,PHP也支持 cURL 库.本文将介绍 cUR ...
- ToDictionary的用法
上次已经查过一次了,这次又忘了...看来有必要记录一下: linq查询结果经常ToList.ToArray什么的,但是ToDictionary用的比较少,导致经常忘记怎么用... ToDictiona ...
- 给 Android 开发人员的 RxJava 具体解释
鉴于 RxJava 眼下这样的既火爆又神奇的现状,而我又在一年的使用过程中对 RxJava 有了一些理解,我决定写下这篇文章来对 RxJava 做一个相对具体的.针对 Android 开发人员的介绍. ...