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

如何访问 POST 请求中的嵌入键值

如何访问 POST 请求中的嵌入键值

Go
桃花长相依 2022-06-27 16:36:47
我正在用 Golang 制作一个轮盘赌 REST API:package mainimport (    "fmt"    "io/ioutil"    "log"    "net/http"    "github.com/gorilla/mux")func handleRequests() {    // creates a new instance of a mux router    myRouter := mux.NewRouter().StrictSlash(true)        myRouter.HandleFunc("/spin/", handler).Methods("POST")    log.Fatal(http.ListenAndServe(":10000", myRouter))}func handler(w http.ResponseWriter, r *http.Request) {    reqBody, _ := ioutil.ReadAll(r.Body)    s := string(reqBody)    fmt.Println(s)}func main() {    fmt.Println("Rest API v2.0 - Mux Routers")    handleRequests()}main.go我正在使用 Python 脚本测试 POST 方法:import requestsurl = 'http://localhost:10000/spin/'myobj = {'bets':[                {                    'amount' : 10,                    'position' : [0,1,2]                },                {                    'amount' : 20,                    'position' : [10]                }            ]}x = requests.post(url, data = myobj)print(x.text)test.py当我运行测试脚本时。服务器收到我的 POST 请求。请求正文是: bets=amount&bets=position&bets=amount&bets=position问题是'amount'和'position'键的值不存在。我的问题是 - 我如何制作/处理 POST 请求,以便能够访问嵌入键的值'amount'和'position'Go 服务器上的处理程序函数中的值,以便我可以将此信息放入结构的实例中。
查看完整描述

2 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

如果您打印出请求的正文/标头,则问题出在 python 方面:


print requests.Request('POST', url, data=myobj).prepare().body

print requests.Request('POST', url, data=myobj).prepare().headers



# bets=position&bets=amount&bets=position&bets=amount

# {'Content-Length': '51', 'Content-Type': 'application/x-www-form-urlencoded'}

data使用x-www-form-urlencoded编码,因此需要一个键/值对的平面列表。


您可能想要json表示您的数据:


print requests.Request('POST', url, json=myobj).prepare().body

print requests.Request('POST', url, json=myobj).prepare().headers


# {"bets": [{"position": [0, 1, 2], "amount": 10}, {"position": [10], "amount": 20}]}

# {'Content-Length': '83', 'Content-Type': 'application/json'}

使固定:


x = requests.post(url, json = myobj) // `json` not `data`

最后,值得检查Content-TypeGo 服务器端的标头,以确保获得所需的编码(在本例中application/json)。


查看完整回答
反对 回复 2022-06-27
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

我认为你需要一个结构来解组数据。我认为这段代码可以帮助你。


package main


import (

    "encoding/json"

    "fmt"

    "github.com/gorilla/mux"

    "io/ioutil"

    "log"

    "net/http"

)


type Body struct {


    Bets []Persion  `json:"bets"`

}

type Persion struct{

    Amount int  `json:"amount"`

    Position []int  `json:"position"`

}


func handleRequests() {

    // creates a new instance of a mux router

    myRouter := mux.NewRouter().StrictSlash(true)


    myRouter.HandleFunc("/spin/", handler).Methods("POST")

    log.Fatal(http.ListenAndServe(":10000", myRouter))

}


func handler(w http.ResponseWriter, r *http.Request) {


    reqBody, _ := ioutil.ReadAll(r.Body)

     bodyObj :=&Body{}

    err:=json.Unmarshal(reqBody,bodyObj)

    if err!=nil{

        log.Println("%s",err.Error())

    }

    //s := string(reqBody)

    fmt.Println(bodyObj.Bets[0].Amount)

}


func main() {

    fmt.Println("Rest API v2.0 - Mux Routers")

    handleRequests()

}


查看完整回答
反对 回复 2022-06-27
  • 2 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

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