为了账号安全,请及时绑定邮箱和手机立即绑定

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条经验 获得超7个赞

你不能含蓄地。的基础数据结构是地图,则该命令不被保证。您需要采取额外的步骤。


然而,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 关注
  • 218 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信