POST到谷歌apis计算引擎给出400

时间:2016-06-10 16:22:57

标签: python google-api google-compute-engine

我正在构建一个小型烧瓶应用程序来处理我正在处理的另一个项目的自动部署。

这涉及使用googleapis设置gcloud防火墙规则。

我已按照以下文档。

https://cloud.google.com/compute/docs/reference/latest/firewalls/insert

当我以下列方式拨打POST电话时。

    headers = {
    'Authorization': 'Bearer {}'.format(access_token)
 }
     name = unique_identifier + "-rule"
     payload = {
          "kind": "compute#firewall",
          "name": name,
          "sourceRanges": [
            "0.0.0.0/0"
          ],
          "sourceTags": [
            unique_identifier
          ],
          "allowed": [
              {
                "IPProtocol": "tcp",
                "ports": [
                 port_number
                ]
              }
            ]
        }
     data = json.dumps(payload)
     r =   requests.post("https://www.googleapis.com/compute/v1/projects/apollo-rocket-chat/global/firewalls?key={MY_API_KEY}",   data=data, headers=headers)

其中port_number和unique_idenifier是字符串。使用我设置的服务帐户检索access_token。我确信令牌是好的,因为我可以使用令牌对受保护资源进行GET调用。

我正在使用python 3.5。

对此POST的响应如下。

{
"error": {
  "errors": [
   {
    "domain": "global",
    "reason": "required",
    "message": "Required field 'resource' not specified"
   }
  ],
  "code": 400,
  "message": "Required field 'resource' not specified"
 }
}

错误消息声称我缺少一个字段,尽管我有以下链接中指定的所有必填字段。

https://cloud.google.com/compute/docs/reference/latest/firewalls/insert#request-body

我究竟做错了什么?

1 个答案:

答案 0 :(得分:0)

想出来。我删除了。

data = json.dumps(payload)

并更改了

 r =   requests.post("https://www.googleapis.com/compute/v1/projects/apollo-rocket-chat/global/firewalls?key={MY_API_KEY}",   data=data, headers=headers)

 r =   requests.post("https://www.googleapis.com/compute/v1/projects/apollo-rocket-chat/global/firewalls?key={MY_API_KEY}",   json=data, headers=headers)