在成熟的语言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参数

这里要分两种情况:

  1. 普通的post表单请求,Content-Type=application/x-www-form-urlencoded
  2. 有文件上传的表单,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])}
}

感谢:在测试post的时候,一开始都是以第二种情况来测试的,所以造成了一个误区以为PostFormValue无法取到值。这里感谢@九头蛇龙 的纠正。

获取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开发中还是有很多不完善的地方。作为使用者来讲,最希望就是直接通过一个方法取到相应的值就可以了,期待官方团队尽早完善。

<!-- 336x280 --> <iframe id="aswift_1" style="left: 0px; top: 0px; position: absolute;" name="aswift_1" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="336" height="280"></iframe>

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

golang web开发获取get、post、cookie参数相关推荐

  1. php get获取cookie值,golang web开发获取get、post、cookie参数

    在成熟的语言java.python.php要获取这些参数应该来讲都非常简单,过较新的语言golang用获取这些个参数还是费了不少劲,特此记录一下. golang版本:1.3.1 在贴代码之前如果能先理 ...

  2. [golang Web开发] 1.golang web开发:简介以及web服务器的搭建以及http协议简介

    一.web开发简介 1.简介 Web应用在我们的生活中无处不在,看看我们日常使用的各个应用程序,它们要么是 Web应用,要么是移动 App 这类 web应用的变种,无论哪一种编程语言,只要它能够开发出 ...

  3. golang web开发

    目录 文章目录 前言 一.golang web是什么? 二.搭建流程 1.模块划分 2.详细开发步骤 总结 前言 例如:习惯了java springboot 开发方式,比较疑惑golang web开发 ...

  4. 微信web开发本地微信web开发工具的调试 redirect_uri 参数错误

    首先明确一点,就是微信web开发调试完全可以在内网条件下进行 比如我的本地的IP为:192.168.0.101 我测试用的是测试公众号 测试公众号的JS接口安全域名 授权回调页面域名 网页授权根据开发 ...

  5. Golang Web开发一键生成各层级模板代码

    文章目录 go_project_quickstart 快速开始 要求 安装 项目实现 架构设计 代码逻辑 统一的调用逻辑 代码复用 每次写web项目,模板都是统一的,每次都要写大量冗余的代码会很烦,在 ...

  6. [转]Java web 开发 获取用户ip

    如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,那么真正的用户端的真实IP则是取X-Forwarded-For中第一个非unknown的有效IP字符串. pu ...

  7. golang web开发框架 Beego

    1 介绍 Beego是一个开源的基于Golang的MVC框架,主要用于Golang Web开发.Beego可以用来快速开发API.Web.后端服务等各种应用. 个人开发 api类:gin 团队大项目: ...

  8. postman post gin 接收不到_golang web开发——gin实战入门

    背景 在之前的一系列golang入门小节中,我们也算管中窥豹,大概了解了一些golang,了解了它的基本语法,在之前的章节中,很多大佬留言或者私信我说,我写的都太过简单,充其量就是一个golang的d ...

  9. 002 第一季SpringBoot2核心技术-核心功能:配置文件、Web开发(原生组件)、数据访问、单元测试、指标监控、原理解析:@Value、命令行参数、手动获取bean、自定义starter

    三.核心技术之- ->核心功能 1. 配置文件 1.1 文件类型 1.1.1 properties 同以前的properties用法 优先级高于yml的方式. 1.1.2 yaml 1) 简介 ...

最新文章

  1. mysql avg 求平均值_使用MySQL中的AVG函数求平均值的教程
  2. java内部类文件,Java内部类学习
  3. aws cognito_使用AWS Cognito的用户管理—(1/3)初始设置
  4. joa-framework 工作流快速开发框架(jeecg官方工作流版本) 发布
  5. Quick cocos2dx学习笔记
  6. POJ 2115 C Looooops (扩展欧几里德解同余方程 Ax = B(mod C) )
  7. 图标设计素材|解析UI设计图标
  8. java读写excel文件
  9. think php上传图片,基于ThinkPHP5.0实现图片上传插件
  10. SPD中赋值连接字段
  11. 一位Android大牛的BAT面试心得与经验总结
  12. 嵌入式学习文章推荐+资料下载
  13. java常见面试考点(九):SSM面试题
  14. 数学悖论与三次数学危机
  15. 【贵州i茅台周年答题--答案】
  16. 数学智力题 武士数独题目_最新智力题大全及答案-各种最新IQ题目推荐-第1595页-33IQ...
  17. 谈谈对MVVM的理解
  18. 探究阿里云物联网开发板1-Haas 100
  19. Egret微信游戏接入
  20. 总结近年来我国主、被动遥感卫星发射的情况

热门文章

  1. 二维数组鞍点问题(C++)
  2. win10+linux系统进入安全模式,Win10进入安全模式的方法
  3. matlab脑肿瘤识别与分割程序_车牌识别算法
  4. 取余运算怎么算_3 数学运算 矩阵操作
  5. java原生开发项目-快递e栈
  6. MySQL 多表查询(Day43)
  7. 《机器人编程实战》一一1.2 给机器人指令
  8. springboot读取src下文件_java(包括springboot)读取resources下文件方式
  9. 棒!使用.NET Core构建3D游戏引擎
  10. 【操作系统/OS笔记17】文件系统基本概念、文件描述符、文件系统访问、文件别名、文件系统种类