package main
import (
"net/http"
"fmt"
"net/url"
"io/ioutil"
"encoding/json"
"log"
)
/**
* Form:存储了post、put和get参数,在使用之前需要调用ParseForm方法
* PostForm:存储了post、put参数,在使用之前需要调用ParseForm方法
* MultipartForm:存储了包含了文件上传的表单的post参数,在使用前需要调用ParseMultipartForm方法
*/
/**
* r.Form是url.Values字典类型
* r.Form["id"]取到的是一个数组类型
* 因为http.request在解析参数的时候会将同名的参数都放进同一个数组里,所以这里要用[0]获取到第一个
*/
func getdemo1(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
if len(r.Form["id"]) > 0 {
fmt.Fprintln(w, r.Form["id"][0])
} else {
fmt.Fprint(w, "获取get请求参数出错")
}
}
/**
* 当url参数和post参数都有id时 getdemo1的方法会出现错误
* 因为r.Form包含了get和post参数 并且以post参数为先 所以应当会取到post参数
*/
func getdemo2(w http.ResponseWriter, r *http.Request) {
queryForm, err := url.ParseQuery(r.URL.RawQuery)
if err == nil && len(queryForm["id"]) > 0 {
// 事实上这个也是标准库ParseForm中关于get参数解析代码
fmt.Fprintln(w, queryForm["id"][0])
} else {
fmt.Fprint(w, "获取get请求参数出错")
}
}
/**
* 普通的post表单请求,Content-Type=application/x-www-form-urlencoded
*/
func postdemo1(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, r.PostFormValue("id"))
}
/**
* 有文件上传的表单,Content-Type=multipart/form-data
* 这个未走通
*/
func postdemo2(w http.ResponseWriter, r *http.Request) {
r.ParseMultipartForm(32 << 20)
if r.MultipartForm != nil {
values := r.MultipartForm.Value["id"]
if len(values) > 0 {
fmt.Fprintln(w, values[0])
}
}
}
func jsondemo1(w http.ResponseWriter, r *http.Request) {
var user map[string]interface{}
body, _ := ioutil.ReadAll(r.Body)
json.Unmarshal(body, &user)
fmt.Fprintln(w, user)
//fmt.Fprintln(w, user["password"])
//fmt.Println("获取json中的username:", user["username"])
//fmt.Println("获取json中的password:", user["password"].(string)) //转字符串通过len(password)!=0判断长度
}
func main() {
http.HandleFunc("/getdemo1", getdemo1)
http.HandleFunc("/getdemo2", getdemo2)
http.HandleFunc("/postdemo1", postdemo1)
http.HandleFunc("/postdemo2", postdemo2)
http.HandleFunc("/jsondemo1", jsondemo1)
err := http.ListenAndServe(":9090", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}