如何在GO中等待POST请求完成?
您好,我正在GO中创建一个POST请求,但它在实际完成之前终止,例如,我正在尝试拉一个docker图像,这可以通过以下方式使用curl完成:如何在GO中等待POST请求完成?,go,docker,docker-compose,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":"3d
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]
而且图像没有被拉入,因此在真正完成之前连接就停止了。我如何解决这个问题?解码器一次只能从一个流中解码一个对象。要获取所有对象,您需要
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...
尝试使用
ioutil.ReadAll
读取整个响应主体,然后解码JSON