在使用Go向本地主机服务器发送GET请求的同时空的响应

我有我的本地主机服务器运行,这是什么,但在docker的容器进程。我想实现一个Go CLIENT来build立REST API的创build,列表,更新,删除function。 当我尝试点击URL时,程序成功退出,但给了我一个空的答复。 此外,我观察到,响应types是“分块”,内容长度为-1。 我是Go新手,试图弄清楚可能的原因是什么,或者是否有人可以提供解决这个问题的方法。 这里是我的代码 – {

package main import ( "encoding/json" "fmt" "io/ioutil" "net/http" ) type Payload struct { Stuff Data } type Data struct { Id string Links Links_container Actions Actions_container AccountID string AgentID string AllocationState string Compute string Created string } type Links_container map[string]string type Actions_container map[string]string func main() { url := "http://localhost:8080/v1/containers" res, err := http.Get(url) if err != nil { fmt.Println(err) } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) } var p Payload err = json.Unmarshal(body, &p) if err != nil { panic(err) } fmt.Println(p.Stuff.AccountID, "\n", p.Stuff.Actions, "\n", p.Stuff.AgentID, "\n", p.Stuff.AllocationState, "\n", p.Stuff.Compute, "\n", p.Stuff.Created, "\n", p.Stuff.Id, "\n", p.Stuff.Links) } 

}

输出 –

地图[]

地图[]

这是服务器的JSON输出 –

{

 "type": "collection", "resourceType": "container", "links": { "self": "…/v1/containers", }, "createTypes": { }, "actions": { }, "data": [ 2 items { "id": "1i2", "type": "container", "links": { … }, "actions": { … }, "accountId": "1a1", "agentId": null, "allocationState": "active", "compute": null, "created": "2014-11-13T23:47:08Z", "createdTS": 1415922428119, "data": { … }, "description": null, "domain": null, "firstRunning": "2014-11-13T23:49:16Z", "firstRunningTS": 1415922556030, "hostname": null, "imageId": "1i1", "imageUuid": "docker:dockerfile/ghost:latest", "instanceTriggeredStop": "stop", "kind": "container", "memoryMb": 256, "name": "dockercontainer", "primaryAssociatedIpAddress": null, "primaryIpAddress": "0.0.0.0.", "removeTime": null, "removed": null, "requestedHostId": "1h1", "startOnCreate": true, "state": "running", "token": "xyz", "transitioning": "no", "transitioningMessage": null, "transitioningProgress": null, "userdata": null, "uuid": "29614f31-4322-4af4-9a55-d9c9395f5cb7", "validHostIds": null, "zoneId": "1z1", "environment": { }, "command": null, "commandArgs": [ ], "directory": null, "user": null, "publishAllPorts": false, "privileged": false, "dockerVolumes": null, "ports": [ ], }, { … }, ], "sortLinks": { … }, "pagination": { … }, "sort": null, "filters": { … }, "createDefaults": { }, 

}

有几件事情,你需要改变,使其工作。

你粘贴的JSON是无效的(用棉签检查它)。 一旦你确定什么是有效的JSON,去代码需要修改如下:

  • 字段需要用选项来“装饰”,告诉JSONparsing器字段名称是什么
  • Payload结构包含基于您提供的JSON描述的一部分Data

修改后的代码看起来如下:

 package main import ( "encoding/json" "fmt" "io/ioutil" "net/http" ) type Payload struct { Stuff []Data `json:"data"` } type Data struct { Id string `json:"id"` Links Links_container `json:"links"` Actions Actions_container `json:"actions"` AccountID string `json:"accountId"` AgentID string `json:"agentId"` AllocationState string `json:"allocationState"` Compute string `json:"compute"` Created string `json:"created"` } type Links_container map[string]string type Actions_container map[string]string func main() { url := "http://localhost:8080/v1/containers" res, err := http.Get(url) if err != nil { fmt.Println(err) } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) } var p Payload err = json.Unmarshal(body, &p) if err != nil { panic(err) } for _, stuff := range p.Stuff { fmt.Println(stuff.AccountID, "\n", stuff.Actions, "\n", stuff.AgentID, "\n", stuff.AllocationState, "\n", stuff.Compute, "\n", stuff.Created, "\n", stuff.Id, "\n", stuff.Links) } } 

这里你在沙箱里有一个工作版本