2014-10-28 64 views
0

我在写代码来访问cloudfoundry平台并提取已推送到云上的所有应用程序的数据摘要。GoLang-PostForm请求更新Cloudfoundry应用程序的资源之一

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

{ 
    "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 /应用/ 71a3c77f-d2791232323-4b7625dq32908492b04f17e ) that contains the summary of info for an individual app. I've been using a http.Postform()`这个网址更新只是这个应用程序的资源之一(我打算更新这个应用程序的实例数量)。

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

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() 
} 

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

回答

-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() 
} 
0

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

类型值映射[字符串] []串

你看到Valuesmap与是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) 

,它应该工作

+0

嘿!感谢您的回答。我尝试了你的建议,虽然它没有给我任何错误,但它没有更新实例:(因为实例是float64,我试图更新另一个资源,实际上是一个名为“名称”的字符串,但也没有工作。其他建议? – 2014-10-29 10:04:27

+0

我不熟悉cloudfoundry - 你可以展示一个curl调用来更新值,我们可以找出你发送的内容有什么不同吗? – dave 2014-10-29 17:07:38

+0

嘿@Dave,谢谢我解决了这个问题。需要在http.NewRequest中使用“Put”方法 – 2014-10-30 16:30:35