亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

r.ParseForm 字段順序

r.ParseForm 字段順序

Go
LEATH 2021-12-07 18:28:32
所以我想保留帖子字段的順序。但是現在使用 httpParseForm函數,它將把字段放入一個地圖中,每次都有不同的順序。原始查詢:a=1&b=2&c=3可以變成b=2&c=3&a=1或任意隨機順序。由于我對查詢進行散列并將其與用戶的散列進行比較,因此我這邊的散列一直在變化,因為字段的順序是隨機的。代碼:func parsePostQuery(r *http.Request, hashQuery string) bool {    urlquery := url.Values{}    r.ParseForm()    for k, p := range r.Form {        urlquery.Set(k, p[0])    }    //some psuedo code    if hashQuery == hash(urlquery.Encode()){        return true    }    return false}如何解析用戶提交的字段并保持用戶的字段順序?旁注:我事先不知道字段名稱。
查看完整描述

3 回答

?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

在與其他答案相同的區域,您將需要客戶端通過在散列之前按字母順序排列所有參數來計算它們的散列。您提供的代碼應該可以正常工作;values.Encode()將按自己的值進行排序

Encode 將值編碼為按 key 排序的“URL 編碼”形式(“bar=baz&foo=quux”)。

沒有辦法保留客戶的順序;事實上,您收到的內容甚至可能與客戶端的訂購方式不同。不管可能性如何,都不能保證中間過程不會改變事情。


查看完整回答
反對 回復 2021-12-07
?
慕田峪9158850

TA貢獻1794條經驗 獲得超8個贊

你不能含蓄地。的基礎數據結構是地圖,則該命令不被保證。您需要采取額外的步驟。


然而,Go maps in action展示了一種以排序方式訪問地圖的簡單方法。您創建一個鍵切片,對該切片進行排序并通過迭代排序切片中的鍵來訪問映射值。


對于您的示例,它看起來像這樣


package main


import (

    "crypto/md5"

    "fmt"

    "io"

    "sort"

)


func main() {

    // Which is the same structure as url.Values()

    var m map[string][]string = make(map[string][]string)

    m["c"] = []string{"19.95"}

    m["b"] = []string{"foo", "bar", "baz"}

    m["a"] = []string{"1"}


    // Note that playground is deterministic, so the order should be preserved there

    // However, you can not rely on that in the real world

    fmt.Println("Unsorted")

    for k, v := range m {

        fmt.Println("Key:", k, "Value:", v)

    }


    var keys []string

    for k := range m {

        keys = append(keys, k)

    }

    sort.Strings(keys)


    hash := md5.New()

    fmt.Println("\nSorted")

    for _, k := range keys {


        fmt.Println("Key:", k, "Value:", m[k])


        // Add Key/Value pair to hash

        fmt.Printf("\tAdding KEY '%s' to hash\n", k)

        io.WriteString(hash, k)

        for _, v := range m[k] {

            fmt.Printf("\tAdding VALUE '%s' to hash\n", v)

            io.WriteString(hash, v)

        }

    }

    fmt.Printf("\nHash: %x", hash.Sum(nil))

}


查看完整回答
反對 回復 2021-12-07
?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

您可以閱讀請求正文并檢查表單參數。它們將以與請求中相同的順序出現(希望您的客戶端應用程序也知道此順序保留)


您可以創建一個讀取器來讀取請求正文。一個示例代碼如下所示


body, err := ioutil.ReadAll(r.Body)

if err != nil {

    fmt.Println("Reading Error ")

    return 

}

fmt.Println("Req Body  :  ", string(body))

注意:注意內容類型


查看完整回答
反對 回復 2021-12-07
  • 3 回答
  • 0 關注
  • 265 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號