Golang请求数据处理

获取参数

我们经常需要获取用户传递的数据,包括GETPOST等方式的请求。你可以通过如下方式获取数据:
通过r.Form.Get("参数名")r.PostForm.Get("参数名")获取对应字段的值,r表示服务器接收或由客户端发送的HTTP请求。在Go标准包net/http中的request.go文件中可以看到该结构体的定义,其中与今天讨论有关的字段有

type Request struct {
	Body 			io.ReadCloser
    Form 			url.Values  
    PostForm 		url.Values
    MultipartForm 	*multipart.Form
}

Body字段后面的这三个字段都需要依赖其他方法,前两者需要调用ParseForm()方法,后者需要调用ParseMultipartForm()方法。

  • 对于所有的请求,ParseFormURL解析原始查询,对于POSTPUTPATCH请求,它还会将请求解析为表单,并将结果放入r.PostFormr.Form中。请求body参数优先于r.Form中的URL查询字符串值。
    对于其他HTTP方法,或者当Content-Type不是application/x-www-form-urlencoded时,该方法不会读取请求body,同时也不会将r.PostForm初始化为非零空值。
    如果请求body的大小没有提前限定,那么它的最大值为10MB
  • ParseMultipartForm解析表单属性enctypemultipart/form-data的内容。func (r *Request) ParseMultipartForm(maxMemory int64) error,调用ParseMultipartForm之后,上传的文件存储在maxMemory大小的内存里面,如果文件大小超过了maxMemory,那么剩下的部分将存储在系统的临时文件中。
直接解析到struct

当请求不能用上面的方法获取时,可以使用ioutil.ReadAll(r.Body)读取请求中的body。再通过struct的字段名或tagbody中对应字段直接解析到struct。定义struct时,字段名后如果有form这个tag,则会以把form表单里的nametag的名称一样的字段赋值给这个字段,否则就会把form表单里与字段名一样的表单内容赋值给这个字段。
如果要忽略一个字段,有两种办法:一是字段名小写开头,二是form标签的值设置为-

完整代码

main.go

package main

import (
	"net/http"
	"fmt"
	"io/ioutil"
	"encoding/json"
	"html/template"
)

type Test struct {
	NickName string `json:"nickname"`
	Phone    string `json:"phone"`
	PassWord string `json:"password"`
}

func main() {
	http.HandleFunc("/test", testFunc)
	http.HandleFunc("/testdata", testData)
	http.ListenAndServe(":8000", nil)
}

func testFunc(w http.ResponseWriter, r *http.Request) {
	t, _ := template.ParseFiles("templates/test.html")
	t.Execute(w, nil)
}

func testData(w http.ResponseWriter, r *http.Request) {
	var test Test
	r.ParseForm()
	test.NickName = r.Form.Get("nickname")
	if test.NickName == "" {
		data, err := ioutil.ReadAll(r.Body)
		if err != nil {
			fmt.Println(err)
			return
		}
		err = json.Unmarshal(data, &test)
		if err != nil {
			fmt.Println(err)
			return
		}
		fmt.Fprintf(w, "====>%s %s %s", test.NickName, test.Phone, test.PassWord)
	} else {
		test.Phone = r.Form.Get("phone")
		test.PassWord = r.Form.Get("password")
		fmt.Fprintf(w, "%s %s %s", test.NickName, test.Phone, test.PassWord)
	}
}

test.html

<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>test</title>
</head>
<body>
<form action="/testdata" method="post">
    NickName:<br>
    <input type="text" name="nickname" value="请输入昵称">
    <br>
    Phone:<br>
    <input type="text" name="phone" value="请输入手机号">
    <br>
    PassWord:<br>
    <input type="text" name="password" value="请输入密码">
    <br><br>
    <input type="submit" value="submit">
</form>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值