【问题标题】:GoLang- PostForm request for updating one of the resources of Cloudfoundry AppGoLang- PostForm 请求更新 Cloudfoundry App 的资源之一
【发布时间】:2014-10-28 15:16:21
【问题描述】:

我正在编写 go 代码来访问 cloudfoundry 平台并提取所有已推送到云端的应用的数据摘要。

我可以单独访问每个应用程序并通过http.GET 请求显示与每个应用程序相关的数据,但我希望能够更新/更改某些特定于应用程序的数据。这是为名为@9​​87654322@ 的应用返回的示例数据:

{
   "metadata": {
      "guid": "71a3c77f-d2791232323-4b7625dq32908492b04f17e",
      "url": "/v2/apps/71a3c77f-d2791232323-4b7625dq32908492b04f17e",
      "created_at": "2000-18-24T",
      "updated_at": "2000-18-27T"
   },
   "entity": {
      "name": "xzys",
      "production": false,
      "space_guid": "65050bcb-81c6-45a2-b6ef-5e7097c7ece1",
      "stack_guid": "89a4fb19-08ef-4c44-90f7-f222a5699fdc",
      "buildpack": null,
      "detected_buildpack": "null,
      "environment_json": {},
      "memory": 1024,
      "instances": 3,
      "disk_quota": 512,
      "state": "STARTED",
      "version": "67124c27-9958-45a7-afc5-5b27007348ab",
      "command": null,
      "console": false,
      "debug": null,
      "staging_task_id": "e901672f958b4ff39d4efb48290367e8",
      "package_state": "STAGED",
      "health_check_timeout": null,
      "staging_failed_reason": null,
      "docker_image": null,
      "package_updated_at": "2014-10-24T12:53:25+00:00",
      "space_url": "/v2/spaces/71a3c77f-d2791232323-4b7625dq32908492b04f17e",
      "stack_url": "/v2/stacks/71a3c77f-d2791232323-4b7625dq32908492b04f17e",
      "events_url": "/v2/apps/71a3c77f-d2791232323-4b7625dq32908492b04f17e/events",
      "service_bindings_url": "/v2/apps/7-4b7625dq32908492b04f17e/service_bindings",
      "routes_url": "/v2/apps/771a3c77f-d2791232323-4b7625dq32908492b04f17e/routes"
   }
}

So I have a url (/v2/apps/71a3c77f-d2791232323-4b7625dq32908492b04f17e) that contains the summary of info for an individual app. I've been using ahttp.Postform()` 到这个 url 来更新这个应用程序的一个资源(我的目标是更新实例的数量这个应用程序)。

这是我用于更新我的应用的“实例”资源的代码:

func UpdateInstances(token string){

    tr := &http.Transport{
        TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
    }

    client := &http.Client{Transport: tr}

    req, err := client.PostForm("/v2/apps/71a3c77f-d2791232323-4b7625dq32908492b04f17e", url.Values{"instances" : 4})
    req.Header.Add("Authorization", token)
    if err != nil {
        log.Fatal(err)
    }
    defer req.Body.Close()
}

这不会给我任何错误,但也不会更新资源。

【问题讨论】:

    标签: go httprequest cloud-foundry instances http-post


    【解决方案1】:

    http://golang.org/pkg/net/url/#Values

    类型值映射[string][]string

    您会看到Values 是map,其键类型为string,值类型为[]string。

    req, err := client.PostForm("/v2/apps/71a3c77f-d2791232323-4b7625dq32908492b04f17e", url.Values{"instances" : 4})
    

    所以你一切都很好,直到值,当你尝试传递一个数字时,它需要一个[]string。改成

    client.PostForm("/v2/apps/71a3c77f-d2791232323-4b7625dq32908492b04f17e",
                      url.Values{ "instances": { "4" }})
    

    或者你可以这样做

    v := url.Values{}
    v.Set("instances", "4")
    client.PostForm("/v2/apps/71a3c77f-d2791232323-4b7625dq32908492b04f17e", v)
    

    它应该可以工作

    【讨论】:

    • 嘿!感谢您的回答。我尝试了你的建议,虽然它没有给我任何错误,但它未能更新实例:(由于实例是 float64,我尝试更新另一个资源,它实际上是一个名为“name”的字符串,但这也不起作用。任何其他建议?
    • 我对 cloudfoundry 不熟悉 - 您能否展示一个用于更新值的 curl 调用,我们可以找出与您发送的内容有何不同?
    • 嘿@Dave,谢谢我解决了这个问题。只需要在 http.NewRequest 中使用“Put”方法
    【解决方案2】:
    func UpdateInstances(token string) {
        tr := &http.Transport{
            TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
        }
       client := &http.Client{Transport: tr}
    
        //Displayed a form and used input value as "instances"
        instStr := r.FormValue("instances")
        inst, err := strconv.Atoi(instStr)//because the put request requires an integer
        if err != nil {
            panic(err)
        }
    
       type command struct {
            Instances int `json:"instances"`
        }
    
        bb, err := json.Marshal(&command{Instances: inst})
        if err != nil {
            log.Fatal(err)
        }
    
        url := "https://asjdklskjfkdsf.com"
    
        req, err := http.NewRequest("PUT", url, bytes.NewBuffer(bb))
        req.Header.Add("Authorization", token)
        if err != nil {
            log.Fatal(err)
        }
        defer req.Body.Close()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      • 2012-02-23
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      相关资源
      最近更新 更多