golang post取参数的一些问题

本文介绍了如何在Golang中获取HTTP请求中的GET、POST参数及Cookie,包括不同类型的POST请求处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

1
2
3
4
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]获取到第一个。

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

1
2
3
4
<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。虽然这种情况并不多见,但是从严谨的角度来看程序上还是应当处理这种情况。立马补上改进代码:

1
2
3
4
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就可以取到了。

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

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

1
2
3
4
5
<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来处理这种情况。

1
2
3
4
5
6
7
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参数

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


转载:http://www.01happy.com/golang-web-get-request-params/

### 使用Golang开发和管理客服系统 构建一个基于Go语言(Golang)的客服系统涉及多个方面,包括架构设计、技术选型以及安全性考虑。以下是针对该主题的一个全面分析。 #### 架构概述 为了实现高效的客服系统,可以采用微服务架构来分离不同的功能模块。这种架构允许独立扩展各个组件并提高系统的可维护性和灵活性。通常情况下,客服系统会分为以下几个主要部分: 1. **身份验证与授权** 客服系统需要支持多种角色(如管理员、客户代表等),因此必须实施强大的认证机制。推荐使用JSON Web Tokens (JWT) 来处理用户登录状态和权限控制[^2]。 2. **数据存储层** 数据库的选择决于具体需求。对于关系型数据库可以选择PostgreSQL或MySQL;而对于非结构化数据,则MongoDB可能更为合适。无论哪种方式,都应确保敏感信息加密保存以保护隐私[^3]。 3. **业务逻辑层** 这一层负责执行核心操作,比如创建工单、分配任务给相应人员等等。通过定义清晰的服务接口(API),可以使前端应用轻松调用这些功能。 4. **通信协议** RESTful API 是目前最常用的一种网络应用程序之间的交互方法之一,在本项目中也可以继续沿用这种方式来进行前后端的数据交换[^4]。 #### 技术栈建议 - 后端框架: Gin 或 Echo 都是非常流行的轻量级Web框架选项,它们提供了高性能路由匹配器以及其他实用工具帮助快速搭建API服务器。 - 前端框架:虽然题目提到Angular作为前端技术方案,但在实际开发过程中可以根据团队熟悉程度灵活调整。 - 认证安全措施:除了基本的密码哈希外,还可以引入OAuth2/OIDC标准进一步增强平台的安全防护能力[^5]。 #### 示例代码片段 下面展示了一个简单的RESTful API示例程序用于演示如何利用Gin框架接收POST请求并将参数打印出来: ```go package main import ( "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.POST("/create_ticket", func(c *gin.Context) { var json struct { Title string `json:"title"` Description string `json:"description"` } if err := c.ShouldBindJSON(&json); err != nil { c.JSON(400, gin.H{"error": "Invalid JSON"}) return } // Process ticket creation logic here... c.Status(201) }) r.Run(":8080") // Listen on port 8080 } ``` 此段代码展示了如何设置一个接受`/create_ticket` POST 请求的基础HTTP服务,并解析传入的消息体中的字段(title 和 description)[^6]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值