猿问

从 bash 到 GO 服务器的 REST post 查询有效但对于 Python 失败

我有解go server组json它收到它。当我使用 时它有效,curl但在 . 的情况下失败python。


去服务器解组代码:


type Data struct {

    Namespace   string `json:"namespace"`

    ContainerId string `json:"containerId"`

}

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

  decoder := json.NewDecoder(r.Body)

  var data Data

  err := decoder.Decode(&data)

  if err != nil {

    glog.Errorf("Failed to decode the request json %s \n", err.Error())

    return

  }

  ...

}

如果我执行 curl 命令,它会毫无怨言地工作:


curl -i -H "Accept: application/json" -H "Content-Type:application/json" -X POST --data '{"namespace": "default", "containerId": "2f7c58d399f2dc35fa1be2abea19301c8e74973ddd72f55a778babf01db5ac26"}' http://mysvc:8080/notify

但是如果我对它做同样的事情Python就会抱怨:


jsonPrep['containerId'] = "2f7c58d399f2dc35fa1be2abea19301c8e74973ddd72f55a778babf01db5ac26"

jsonPrep['namespace'] = "default" 

headers = {'Content-type': 'application/json', 'Accept': 'application/json'}

r = requests.post('http://mysvc:8080/notify', json=json.dumps(jsonPrep), headers=headers)

抱怨go server:


E1026 15:49:48.974117       1 main.go:59] Failed to decode the request json json: cannot unmarshal string into Go value of type main.Data

当我curl在python.


谁能帮我找出问题所在?


12345678_0001
浏览 87回答 1
1回答

慕森卡

json的参数用于requests.post()传递尚未调用json.dumps()它的值。 requests调用json.dumps()参数json本身,所以因为你正在传递json=json.dumps(jsonPrep),jsonPrep最终会被 JSONified 两次,这不是你想要的。要么使用data:requests.post(..., data=json.dumps(jsonPrep), ...)或摆脱json.dumps():requests.post(..., json=jsonPrep, ...)
随时随地看视频慕课网APP

相关分类

Go
我要回答