1. 程式人生 > >go語言web系列1 接收請求的引數

go語言web系列1 接收請求的引數

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)
	}
}