在測試GET和POST原本都很順利
直到有一次在做轉址功能時
想把POST資料轉出來變成GET
發現兩件詭異又奇怪的事:
1. GET和POST只有Method區隔,但是取得資料源並無不同:
舉例來說雖然是GET,但是從PostForm也可以取得Request資料, 反之亦同
2. 必須先使用過 FormValue(<key>) 否則Form和PostForm內都不會有map資料
夠詭異吧!
我想是因為沒有呼叫FormValue所以沒有資料被Parse出來塞到預設的Form裏面
不知道net/http為啥要這樣設計
不過這也只是方便大家的小玩具
那也不要太計較太多了
以下為HTTP簡易轉址程式:
package main
import (
"fmt"
"bytes"
"strings"
)
type Hello struct{}
func (h Hello) ServeHTTP(
w http.ResponseWriter,
r *http.Request) {
var url bytes.Buffer
url.WriteString("http://www.yahoo.com")
url.WriteString(r.URL.String())
if r.Method == "POST" {
url.WriteString("?")
r.FormValue("") //沒有這行r.Form也無法取的正確資料
for kk, e := range r.Form {
url.WriteString(kk)
url.WriteString("=")
url.WriteString(e[0])
url.WriteString("&")
}
}
http.Redirect(w, r, url.String(), http.StatusFound)
}
func main() {
var h Hello
http.ListenAndServe("localhost:80", h)
}
沒有留言:
張貼留言