Go Web Chapter2-Form

本文介绍了Go语言中处理HTTPPOST请求时,如何解析不同enctype类型的表单数据,包括application/x-www-form-urlencoded和multipart/form-data。通过示例代码展示了如何使用ParseForm和ParseMultipartForm方法访问Form、PostForm以及MultipartForm字段,强调了不同enctype情况下应使用的方法和字段。
摘要由CSDN通过智能技术生成
package main

import (
	"fmt"
	"net/http"
)

/*
	表单post请求的数据格式
		通过POST发送的name-value数据对的格式可以通过表单的Contest Type指定
		即enctype属性:默认值为 application/x-www-form-urlencoded
		<form  action="/process" method="post" enctype="application/x-www-form-urlencoded">
			<input type="text" name="first_name"/>
			<input type="text" name="last_name"/>
			<input type="submit"/>
    	</form>
		如果 enctype = application/x-www-form-urlencoded ,则:
			浏览器会将表单数据编码到查询字符串里,例如:
				first_name=jian&last_name=shi
		如果 enctype = multipart/form-data ,则:
			每一个name=value对都会被转换为一个MIME消息部分
			每一个部分都有自己的Content Type 和 Content Disopsioton
		如何选择两种格式?
		1.简单文本:application/x-www-form-urlencoded
		2.大量数据,例如上传文件:multipart/form-data
*/

/*
	Form 字段
	Request上的函数允许我们从URL或者Body中提取数据,
		Form
		PostForm
		MultipartForm
	Form里面的数据是key-value对
	通常做法是:
		先调用ParseForm或ParaseMultipartForm来解析Request
		然后访问Form PostForm MultipartForm字段
	如果只想得到first_name这个key的Value,可使用r.Form["first_name"],返回包含一个元素的slice
	如果表单和URL里有同样的key,那么透明将会存放再同一个slice里,表单值靠前,url值靠后。
	如果只想要表单的key,不要URL的,可以使用PostForm
*/

/*
	PostForm 字段
	如果只想要表单的key,不要URL的,可以使用PostForm
	但是 Form 和 PostForm 均不支持 表单post请求的数据格式enctype = multipart/form-data,
							支持  enctype = application/x-www-form-urlencoded
	而MultipartForm支持 enctype = multipart/form-data
*/

/*
	MultipartForm 字段
	要想使用MultipartForm,首先需要调用ParseMultipartForm()方法
			该方法会在必要时调用ParseForm(),参数是需要读取的数据的长度
	MultipartForm只包含表单的key-value对
	返回类型是一个struct而不是map,这个struct里有两个map
		key string   value []string
		key string   value 文件 (本例为空)
*/

//--------------------------------------------------------------//
/*
	FormValue方法会返回Form字段指定key对应的第一个value,无需再调用ParaseForm
	PostFormValue同样,但二者似乎受enctype类型影响??
*/
func multipartForm() {
	server := http.Server{
		Addr:    "localhost:8080",
		Handler: nil,
	}

	http.HandleFunc("/process", func(w http.ResponseWriter, r *http.Request) {
		r.ParseMultipartForm(1024)
		fmt.Fprintln(w, r.MultipartForm)
	})

	server.ListenAndServe()
}

func form() {
	server := http.Server{
		Addr:    "localhost:8080",
		Handler: nil,
	}

	http.HandleFunc("/process", func(w http.ResponseWriter, r *http.Request) {
		r.ParseForm()
		fmt.Fprintln(w, r.Form)
	})

	server.ListenAndServe()
}

func postform() {
	server := http.Server{
		Addr:    "localhost:8080",
		Handler: nil,
	}

	http.HandleFunc("/process", func(w http.ResponseWriter, r *http.Request) {
		r.ParseForm()
		fmt.Fprintln(w, r.PostForm)
	})

	server.ListenAndServe()
}

func main() {
	//form()
	//postform()
	multipartForm()
}

form.html 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Form</title>
</head>
<body>
    <form  action="http://localhost:8080/process" method="post" enctype=application/x-www-form-urlencoded">
        <input type="text" name="first_name"/>
        <input type="text" name="last_name"/>
        <input type="submit"/>
    </form>

</body>
</html>

postform.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Form</title>
</head>
<body>
    <form  action="http://localhost:8080/process?first_name=xiao&last_name=ming" method="post" enctype=application/x-www-form-urlencoded">
        <input type="text" name="first_name"/>
        <input type="text" name="last_name"/>
        <input type="submit"/>
    </form>

</body>
</html>

 

MultipartForm.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Form</title>
</head>
<body>
    <form  action="http://localhost:8080/process?first_name=xiao&last_name=ming" method="post" enctype="multipart/form-data">
        <input type="text" name="first_name"/>
        <input type="text" name="last_name"/>
        <input type="submit"/>
    </form>

</body>
</html>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值