2014年9月8日 星期一

[golang] HTML服務GET和POST測試

在測試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)
}

沒有留言:

張貼留言