go - 如何等到 POST 请求在 GO 中完成?

标签 go docker docker-compose

您好,我正在 GO 中创建一个 POST 请求,但它在实际完成之前就终止了,例如,我正在尝试拉取一个 docker 镜像,这可以通过以下方式使用 curl 完成:

curl -X POST https://address/images/create?fromImage=imagename 

这将返回以下内容

{"status":"Pulling from imagename","id":"latest"}
{"status":"Already exists","progressDetail":{},"id":"3d30e94188f7"}
{"status":"Already exists","progressDetail":{},"id":"bf4e27765153"}
{"status":"Already exists","progressDetail":{},"id":"67280fd39fba"}
.... many of those
{"status":"Pull complete","progressDetail":{},"id":"21c062e2346f"}
{"status":"Digest: sha256:24f26a1344fca6d5ee1adcdsf2d01b20d7823c560ed9d2193466e36bd1f049088"}
{"status":"Pulling from imagename","id":"20161005"}
{"status":"Digest: sha256:f527dsfds88676eb25d8f7de5406f46cbc3a995345ddb4bb3d08fcf110458fe3cf"}
{"status":"Status: Downloaded newer image for imagename"}

并且镜像拉取成功

但是如果我从头开始尝试

func PullImage(imagename string, uuid string) error {
logFields := log.Fields{

    "handler": "PullImage",
    "uuid":    uuid,
}

log.WithFields(logFields).Debugf("imagename:%v", imagename)

url := fmt.Sprintf("https://%s/images/create?fromImage%s", sconf.Docker.Endpoint, imagename)
req, err := http.NewRequest("POST", url, nil)

req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req)

log.WithFields(logFields).Infof("call url:%s", url)
if err != nil {
    log.WithFields(logFields).Errorf("Error in call url (%s) :%s", url, err)

    return errors.New(fmt.Sprintf("Error in call url (%s) :%s", url, err))
}


var pullresbody interface{}
err = json.NewDecoder(resp.Body).Decode(&pullresbody)
if err != nil {
    log.WithFields(logFields).Errorf("Could not unmarshal json: %s", err)
    return errors.New(fmt.Sprintf("Could not unmarshal json: %s", err))
}

    log.WithFields(logFields).Infof("response of url %s:%+v", url, resp)
log.WithFields(logFields).Infof("response body:%+v", pullresbody)
   return nil

然后我在日志中得到这个:

map[status:Pulling from imagename]

并且图像未被拉取,因此在真正完成之前连接已停止我该如何解决这个问题?

最佳答案

Decoder 一次只会从流中解码一个对象。要获取所有对象,您需要类似的东西

var pullRespBody interface{}
dec := json.NewDecoder(resp.Body)
var err error
for err == nil {
    err = dec.Decode(&pullRespBody)
    // Check err...
    log.WithFields(logFields).Infof("response body:%+v", pullRespBody)
    // Do something else with pullRespBody...
}
// Deal with err...

关于go - 如何等到 POST 请求在 GO 中完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39892119/

相关文章:

go - 测试在后台线程中运行的函数的结果

docker - docker 容器之间丢失 UDP 数据包

docker-compose 更新容器路径

spring-boot - 第一次调用时出现 ZuulException (SendErrorFilter)

Golang例程每分钟任务

ssl - 如何在 Heroku 上使用 Go 修复 TLS 握手错误?

go - 构建期间的模块依赖缓存问题

python - django_crontab 不适用于生产 docker

docker - Helm 图表部署和私有(private) docker 存储库

java - 应用程序无法使用 docker 连接到 smtp 主机和端口 587