猿问

r.ParseForm 字段顺序

所以我想保留帖子字段的顺序。但是现在使用 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

}

如何解析用户提交的字段并保持用户的字段顺序?


旁注:我事先不知道字段名称。


LEATH
浏览 219回答 3
3回答

蝴蝶不菲

在与其他答案相同的区域,您将需要客户端通过在散列之前按字母顺序排列所有参数来计算它们的散列。您提供的代码应该可以正常工作;values.Encode()将按自己的键对值进行排序:Encode 将值编码为按 key 排序的“URL 编码”形式(“bar=baz&foo=quux”)。没有办法保留客户的顺序;事实上,您收到的内容甚至可能与客户端的订购方式不同。不管可能性如何,都不能保证中间过程不会改变事情。

慕田峪9158850

你不能含蓄地。的基础数据结构是地图,则该命令不被保证。您需要采取额外的步骤。然而,Go maps in action展示了一种以排序方式访问地图的简单方法。您创建一个键切片,对该切片进行排序并通过迭代排序切片中的键来访问映射值。对于您的示例,它看起来像这样package mainimport (    "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))}

紫衣仙女

您可以阅读请求正文并检查表单参数。它们将以与请求中相同的顺序出现(希望您的客户端应用程序也知道此顺序保留)您可以创建一个读取器来读取请求正文。一个示例代码如下所示body, err := ioutil.ReadAll(r.Body)if err != nil {    fmt.Println("Reading Error ")    return }fmt.Println("Req Body  :  ", string(body))注意:注意内容类型
随时随地看视频慕课网APP

相关分类

Go
我要回答