double2022 2016-07-21 07:42
浏览 332

如何直接从http.Get in Go中获得的json直接打印到http.ResponseWriter?

This is my code:

func GetRepositories(w http.ResponseWriter, r *http.Request) {
   w.Header().Set("Access-Control-Allow-Origin", "*")
   res, err := http.Get(fmt.Sprintf("%s/%s", sconf.RegistryConf.url, sconf.RegistryConf.listrepo))
   if err != nil {
      w.WriteHeader(500)
      log.Errorf("Could not get repositories: %s", err)
      return
   }
  log.Info("Repositories returned")
  fmt.Fprintf(w, fmt.Sprintf("%v", res))

}

What I am trying to do is to directly print the same thing that appears when I access the URL inside http.Get which is in JSON format, but I am getting other things. How can I do this without umarshaling the JSON content form http.Get and then marshaling it and returning it?

  • 写回答

1条回答 默认 最新

  • dsd57259 2016-07-21 07:53
    关注

    The http.Response returned by http.Get() is not just the (JSON) data sent by the server, it's a struct containing all other HTTP protocol related fields (e.g. HTTP status code, protocol version, header values etc). What you need to "forward" is only the Response.Body field which is an io.ReadCloser, so you can read the actual data from it sent by the server.

    You may use io.Copy() to copy the body from the response of http.Get() to your http.ResponseWriter. Before that it's recommended to set the same content type that you get.

    defer res.Body.Close()
    if contentType := res.Header.Get("Content-Type"); contentType != "" {
        w.Header().Set("Content-Type", contentType)
    }
    if _, err := io.Copy(w, res.Body); err != nil {
        // Handle error
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 划分vlan后不通了
  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大