在成熟的语言java、python、php要获取这些参数应该来讲都非常简单,过较新的语言golang用获取这些个参数还是费了不少劲,特此记录一下。
golang版本:1.3.1
在贴代码之前如果能先理解一下golang http.request的三个属性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]) } }
感谢:在测试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中,发起HTTP请求...无论是简单的GET请求还是复杂的POST请求,都可以通过设置合适的参数和方法轻松完成。在实际开发中,根据具体需求选择合适的方法,并注意处理可能出现的错误,以确保请求的稳定性和可靠性。
这里我从了Golang SDK自带的net/http包提供的HTTP相关API,虽然本身提供了http.PostForm()、http.Post()以及http.Get()封装好的方法,但是在处理HTTPrequest的header和cookie处理缺乏灵活性,所以我重新将net/http...
结合其他Gorilla组件,如session管理、cookie处理等,可以构建出完整的、强大的Web服务。同时,Go-mux的性能也非常优秀,得益于Golang的并发模型和类型安全,它在处理大量请求时能保持高效运行。因此,无论你是新手...
在Golang中实现跨域访问,主要是为了克服Web应用程序中由同源策略导致的限制,使得前端能够通过Ajax从不同源获取数据。本篇将详细解释如何在Golang后端设置CORS(跨域资源共享)策略,以便允许前端进行跨域请求。 ...
- **URL 参数**:可以通过在路由路径中使用 `:param` 来获取 URL 参数,例如 `r.GET("/user/:id")`,`c.Param("id")` 可以获取 id 参数。 - **表单参数**:Gin 可以解析表单数据,包括 POST 请求中的 form-...
此函数接收三个参数:请求方法(如"GET")、目标URL和请求体(此处为`nil`表示无请求体)。 - **设置请求头**:使用`reqest.Header.Add()`方法可以在请求头中添加自定义键值对。这里的`Add`方法允许多次调用以添加...
面试时会涉及HTTP方法(GET、POST等)、状态码、首部字段、缓存机制、HTTPS安全协议、RESTful设计原则以及HTTP/2的新特性。 8. **Web**:Web技术包括HTML、CSS、JavaScript等,面试中可能会讨论前端MVC框架(如...
- **Web工作方式**:理解HTTP协议,包括请求方法(GET、POST等)、状态码、头信息等。 - **Go的http包**:这是Go语言构建Web服务的基础,提供创建服务器、处理请求和响应的功能。 - **搭建Web服务**:通过`...
在Golang中进行HTTP请求是一个常见需求,它广泛用于各种Web开发和API交互场景。Golang标准库中的`net/http`包为我们提供了发送HTTP请求的丰富接口。本文将详细介绍几种在Golang中发送HTTP请求的常见方式,并通过示例...
2. **请求方法支持**:支持GET、POST、PUT、DELETE、PATCH等各种HTTP方法,满足日常开发中的各种需求。 3. **参数设置**:可以方便地设置请求头(Headers)、查询参数(Query Parameters)、请求体(Body)等,支持...
4. **HTTP请求**:学习如何使用Colly发送GET和POST请求,设置请求头,处理Cookie和Session。 5. **HTML解析**:使用Colly的内置功能或者配合如GoQuery这样的库来解析HTML内容,提取所需数据。 6. **并发控制**:...
在Web开发中,跨域问题常常困扰着开发者,特别是涉及到登录认证、状态保持等场景时,因为浏览器的同源策略会阻止跨域请求携带cookies。然而,有些情况下我们需要在跨域请求中保持登录状态,这就涉及到如何处理跨域...
Gin 框架是用 Go 语言开发的一款轻量级 web 框架,它以高性能和简洁的代码结构著称。本教程将带你逐步了解并掌握 Gin 的使用,包括环境搭建、路由处理、模板渲染、中间件机制、模型操作以及数据库交互等方面。 一、...
func ( r * Req ) Post ( url string , v ... interface {}) ( * Resp , error ) 在大多数情况下,只需要url,其他是可选的,例如标头,参数,文件或正文等。 有一个默认的Req对象,它的所有公共方法都由
Go,也被称为Golang,是由Google开发的一种静态类型、编译型、并发型、垃圾回收型的编程语言。Go语言的设计目标是提高开发者的生产力,同时保持系统的效率和可靠性。它简洁的语法、高效的性能以及内置的并发支持,...
`http.Get`函数用于发送GET请求,而`http.Post`则用于POST请求。通过设置`http.Client`的超时、重试策略等,可以定制更复杂的网络行为。 4. **HTML解析** Go语言中有多种库可以用来解析HTML,如`goquery`(模仿...
Go,也被称为Golang,是由Google开发的一种静态类型的编译型编程语言。它以其简洁的语法、高效的性能和内置并发支持而受到广泛欢迎。Go特别适合构建网络服务和分布式系统,是编写服务器端应用程序的理想选择。 REST...
在Golang中,发起一个GET请求非常直观: ```go package main import ( "fmt" "net/http" ) func main() { resp, err := http.Get("http://example.com") if err != nil { fmt.Printf("Error: %v\n", err) ...
这个包提供了发送GET、POST等HTTP方法的函数,如`http.Get()`和`http.Post()`, 用于获取网页内容。同时,`http.Response`结构体包含了响应的状态码、头部信息和实际的响应体,这些都是爬虫解析网页所必需的。 为了...