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

时间:2018-10-26 16:04:32

标签: python json curl go marshalling

我有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与其余查询时,我看不出有什么不同。

有人可以帮助我确定问题吗?

1 个答案:

答案 0 :(得分:2)

json的{​​{1}}参数用于传递尚未调用requests.post()的值。 json.dumps()requests参数本身调用json.dumps(),因此,由于您传递了jsonjson=json.dumps(jsonPrep)最终会被两次JSON化,这不是您所需要的。想要。

使用jsonPrep

data

或摆脱requests.post(..., data=json.dumps(jsonPrep), ...)

json.dumps()