繁体   English   中英

去http请求重定向

[英]Go http request redirect

我正在编写一个 API,它必须将传入请求重定向到另一个服务,响应必须转发给原始请求者。

我认为像下面这样的简单函数应该可以解决问题,但我错了。

我从重定向的响应中收到数据,但是当我将其发送回初始请求时,我收到了没有任何数据的Could not get response. Error: socket hang up Could not get response. Error: socket hang up

如果我尝试使用邮递员直接到重定向 URL 执行完全相同的请求,它工作得很好。

func initialAssetsHandler(w http.ResponseWriter, r *http.Request) {
    body, err := ioutil.ReadAll(r.Body)
    if err != nil {
        fmt.Println(err)
        return
    }

    resp, err := http.Post(conf.redirectURL, "application/json", bytes.NewReader(body))
    if err != nil {
        log.Error(err)
    }
    defer resp.Body.Close()
    buf := new(bytes.Buffer)
    buf.ReadFrom(resp.Body)
    log.Info(string(buf.Bytes()))

    var data json.RawMessage
    if err = json.NewDecoder(resp.Body).Decode(&data); err != nil {
        fmt.Println(err)
        return
    }
    helper.SendJsonRaw(w, 200, data)
}

这是 SendJsonRaw 函数:

func SendJsonRaw(w http.ResponseWriter, status int, r json.RawMessage) error {
    w.Header().Set(HeaderContentType, MimeApplicationJSON)
    w.WriteHeader(status)
    _, err := w.Write(r)
    return err
}

r.Body由 json 解码器读取到EOF ,然后当您将其传递给重定向请求时,它对 http.Client 来说看起来是的,因此它不发送任何正文。 您需要保留正文的内容。

例如,您可以执行以下操作:

func initialAssetsHandler(w http.ResponseWriter, r *http.Request) {
    body, err := ioutil.ReadAll(r.Body)
    if err != nil {
        fmt.Println(err)
        return
    }

    var initialAssets TagAssets
    if err := json.Unmarshal(&initialAssets, body); err != nil {
        if !strings.Contains(err.Error(), "json: invalid use of ,string struct tag, trying to unmarshal") {
            helper.SendJsonError(w, http.StatusBadRequest, err)
            return
        }
    }

    resp, err := http.Post(conf.redirectURL, "application/json", bytes.NewReader(body))
    if err != nil {
        log.Error(err)
    }
    defer resp.Body.Close()
    log.Info(resp)

    var data json.RawMessage
    if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
        fmt.Println(err)
        return
    }
    helper.SendJsonOk(w, data)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM