七叶笔记 » golang编程 » Go语言Web编程,POST请求,Form、PostForm、MultipartForm

Go语言Web编程,POST请求,Form、PostForm、MultipartForm

Request查询参数URL Query

URL Query

1. GET

上一节学习了GET请求获取, ,

2. POST

我们不用html提交POST请求,考虑用2个工具,第一个是Postman,第二个是Go的单元测试方法。

(1)Form(不仅能获取GET请求,也可以获取到POST请求内容,而POST请求优先GET)

调用ParseForm或者ParseMultipartForm解析Request

相应访问Form、PostForm或MultipartForm字段

实现函数源码

测试代码:

执行结果

解析源码:

27行:w.Header().Set(“Content-Type”, “application/json”),设置了响应的内容类型为Json。

29行://调用ParseForm或者ParseMultipartForm解析Request

32行:可以进行指定Key获取与给定键关联的第一个值。如果没有与键关联的值,Get返回空字符串。

37行到40行:将Form数据转换成json类型,通过for range将所有的值转成map。

44行:将map转成json格式

解析测试代码:

// 使用http.HandlerFunc声明一个handler,将测试函数PostData传入进去

handler := http.HandlerFunc(PostData)

// 用刚申明的handler启动测试服务器

server := httptest.NewServer(handler)

//启动服务器最后要关闭

defer server.Close()

// 显示URL地址

t.Log(server.URL)

// 定义URL传递的参数值,和Method无关,

//使用 url.Values进行定义,类型是 map[string][]string

values := url.Values{“id”: {“888”}, “name”: {“张无忌”}}

//将传递的参数值进行编码,

//例如id=123&name=zhangsnafeng,

//通过Encode()实现,返回值类型是string

e := values.Encode()

t.Log(e)

//这里启动1个POST请求,

//第一个参数是指定的URL,string类型

//第二个参数是发送的请求内容的类型, string类型。

//第三个是发送的主体。 io.Reader类型,因此需要strings.NewReader()将拼接的字符串进行转换

response, _ := http.Post(

server.URL+”/post”,

“application/x-www-form-urlencoded”,

strings.NewReader(e),

)

//通过ioutil.ReadAll读取body内容,返回值是字节集[]byte类型

bytes, _ := ioutil.ReadAll(response.Body)

t.Log(string(bytes))

(2)PostForm (不能获取GET请求,只能获取到POST请求内容)

使用Form的结果

可以看到Form不仅获取到了Get的请求信息,也获取到了Post的请求信息。

当我们仅需要Post请求信息怎么办呢?

执行结果

可以看到,只用修改1个位置就完成了这个功能。

代码详解同上面第一个详解大同小异:

60行: 采用PostForm方法获取表单内容

(3)MultipartForm

(3)FormValue与PostFormValue,用法相似

代码解析:

func FormValueData(w http.ResponseWriter, r *http.Request) {

_ = r.ParseForm()

//FormValue优先取POST的name的第一个值,如果POST没有name,name就取GET的Name。

name1 := r.FormValue(“name”)

//FormValue取POST、PATCH或PUT的name的第一个值。URL查询参数将被忽略。如果key不存在,PostFormValue返回空字符串。

name2 := r.PostFormValue(“name”)

data := map[string]interface{}{

“name1”:name1,

“name2”:name2,

}

bytes, _ := json.Marshal(data)

_, _ = w.Write(bytes)

}

相关文章