首页 > 其他分享 >golang web开发获取get、post、cookie参数

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

时间:2023-01-05 17:33:17浏览次数:55  
标签:web Form get fmt golang 参数 post id


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

这里要分两种情况:

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


<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参数​

标签:web,Form,get,fmt,golang,参数,post,id
From: https://blog.51cto.com/kenkao/5991641

相关文章

  • webgame 上线版本控制
    ​ webgame上线版本控制我的项目应用的方法:类库:​​LoaderMax​​素材加载用XML文件配置的(loadAssets.xml): <?xmlversion="1.0"encoding="utf-8"?> <data>    <......
  • flutter webview_windows 简单使用
    class_MyHomePageStateextendsState<MyHomePage>{finalWebviewController_webViewController=WebviewController();@overridevoidinitState(){sup......
  • GET和POST
    Get和Post请求有什么区别?Get和Post是什么?get和post其实都是http的请求方法。除了这2个请求方法之外,http还有head、put、delete、trace、connect、options这6个请求......
  • does not specify a Swift version and none of the targets integrating it have th
    [!]UnabletodetermineSwiftversionforthefollowingpods:   -`HandyJSON`doesnotspecifyaSwiftversionandnoneofthetargets(`XPX`and`XPXTes......
  • webpack 中import 引入umd模块module
    在webpack项目中引入一个umd模块,如果你的项目是由create-react-app搭建的,很大概率会遇到importerror。这很大概率是由于babel-loader重复编译导致的,因为umd模块一般是经......
  • 【web】Emscripten一些注意事项
    中文网址https://cntofu.com/book/150/zh/ch1-quick-guide/ch1-01-install.md编译选项-sSAFE_HEAP=1可以检测到内存未对齐的错误,但是会影响性能,应该只在测试时使用-s......
  • 在线客服系统的源码中Golang Gin框架实现IP白名单机制
    我的客服系统有一些接口是专门给内部调用的,只允许其他内部系统来调用,不允许随意访问,可以使用IP白名单机制使用Gin框架实现IP白名单机制可以使用中间件的方式实现。你......
  • Web实现浏览器端大文件分片上传
    ​ 一、概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用......
  • Go语言(golang)开源项目大全
    ​​http://www.open-open.com/lib/view/open1396063913278.html#Compression​​内容目录​​Astronomy​​​​构建工具​​​​缓存​​​​云计算​​​​命令行选项解......
  • 在线客服系统源码编译Golang语言下go build命令构建二进制程序
     gobuild 命令好处我开发了一套在线客服系统源码,使用了gobuild进行编译在我的在线客服系统使用gobuild命令的主要好处是,它可以将Go程序编译成可执行文件,这样就......