如何等待POST请求完成在GO?

您好我正在GO中创build一个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只能解码stream中的一个对象。 要获取所有对象,你需要类似的东西

 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...