dragon88112 2014-11-15 07:23
浏览 129
已采纳

使用Go向本地服务器发出GET http请求时为空响应

I have my localhost server running which is nothing but the container process in a docker.I am trying to implement a Go CLIENT to build REST api's for Create, List, Update, Delete functionalities. When I try to hit the URL, the program exits successfully but gives me an empty response. Further I observed, that the response type is "chunked" with the content length as -1. I am new to Go and trying to figure out what could be the possible reasons or could anyone provide a solution to this problem. Here it my code - {

 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, "
", p.Stuff.Actions, "
",
        p.Stuff.AgentID, "
", p.Stuff.AllocationState, "
", p.Stuff.Compute,
        "
", p.Stuff.Created, "
", p.Stuff.Id, "
", p.Stuff.Links)
}

}

Output-

map[]

map[]

This is the JSON output from the server -

{

"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": { },

}

  • 写回答

1条回答 默认 最新

  • dpd46554 2014-11-15 10:25
    关注

    There are several things that you need to change to make it work.

    The JSON you pasted is not valid (check on it with a linter). Once you are sure that what is coming in is valid JSON, the go code needs to be modified as follows:

    • Fields need to be "decorated" with options that tell the JSON parser what the field names are
    • The Payload struct contains a slice of Data based on the JSON description you provided

    The modified code would look then:

    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, "
    ", stuff.Actions, "
    ",
                stuff.AgentID, "
    ", stuff.AllocationState, "
    ", stuff.Compute,
                "
    ", stuff.Created, "
    ", stuff.Id, "
    ", stuff.Links)
        }
    }
    

    Here you have a working version in the sandbox

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!