为了账号安全,请及时绑定邮箱和手机立即绑定

高浪大响应 JSON 输入意外结束

高浪大响应 JSON 输入意外结束

Go
慕桂英4014372 2022-09-26 20:27:13
我正在向服务器发送请求,并尝试取消对 HTTP 响应的封口。这很奇怪,但有些响应返回 200 并且没有给出非马歇尔错误,而其中一些回复返回 200 并给出取消马歇尔错误。我的客户端代码如下所示:func SendRequest(requestModel *model.Request) (*model.Response, error) {    responseModel := &dspModel.Response{}    byteData, err := json.Marshal(requestModel)    if err != nil {        zap.S().Errorf("Error marshalling request. Err: %v", err)        return nil, err    }    url := "xx"    request, _ := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(byteData))    request.Close = true    client := &http.Client{}    response, err := client.Do(request)    if err, ok := err.(net.Error); ok && err.Timeout() {        zap.S().Error("Response timeout exceed")        return nil, errors.New("Response timeout exceed")    }    if err != nil || response == nil {        errorMessage := "not respond"        zap.S().Error(errorMessage)        return nil, errors.New(errorMessage)    }    defer response.Body.Close()    if response.StatusCode == http.StatusOK {        err = json.NewDecoder(response.Body).Decode(&responseModel)        if err != nil {            // Error occurred here!            errorMessage := "Request response decode error"            zap.S().Errorf("%v, Err: %v", errorMessage, err)            return nil, errors.New(errorMessage)        }        return response, nil    } else if response.StatusCode == http.StatusNoContent {        return nil, nil    } else {        bodyBytes, _ := ioutil.ReadAll(response.Body)        errorMessage := "not respond"        zap.S().Errorf("%v, StatusCode %v, Response: %v Request: %v", errorMessage, response.StatusCode, string(bodyBytes), string(byteData))        return nil, errors.New(errorMessage)    }}我怀疑响应,因为它太长了,并且具有不同的字符。响应如下所示:当我调试错误时,我注意到一半的响应不可见。错误声明:响应模型:type Response struct {    Tax  Tax    `json:"tax"`    Cur  string `json:"cur"`    Rack []Rack `json:"rack"`    Gno  string `json:"gno"`}type Tax struct {    Ver string `json:"ver"`}type TaxOfTur struct {    Name string `json:"name"`}可能不相关,但请求是并发的,我的测试用例仅基于一个并发请求。那么我该如何解决这个问题呢?
查看完整描述

1 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超8个赞

我试图在我的末端实现你的代码,它给出了预期的输出。下面给出了我尝试的代码。


注意:这不是确切问题的解决方案,因为我无法重现相同的问题。


// Response struct definition here...

// ..


// The trouble making JSON.

const msg = `{"tax":{"ver":"1.0"},"cur":"EUR","rack":[{"tur":[{"zar":2.599886212,"domain":["test.com"],"ney":"https://censored.com/nimp?fuid=&ic=EWRMh-.UTPdNvWB-JYa58c85N0fEPgXunKp3wwyPadp7jwqHgZbz4dG0A51OVO-2Gs0znYmLcPIH0ThEmpsYl8wKofo9ytJ2A3uWr9Kn-dNxeh.k8lIml9kavPk1.dk7f.46xKX7IVpf3.yU-Yx1KetQl3Q9f-iePn7B86yjVgMxkTNfhZAg0pP0kKZaJMd2orLXoV4xPXmwTdfJbWJU5bGAUROJT-Yd7yTHoVveuvOBClHzM4cgHFmGxzox6cCJ2gZB.7fqKkPzECXwdpobmO0RWxdu224-FADd.oM4DghIEpdZJe.FjEq0stQnJBT.puw0JamHgT15NdSQN7voBJ8UqGCDOu1qSLece6Iy.PN392xGWhxs0URbrWhSEgkhCr.R4ol9kjrMqK78shw2gHBJjEzKeBeo6lBzU8YfoKDM7oPlj5SwmL6sV2i2UaWJbEtreRt3oABDPab--AevfJW2rQ0-2iyt-rJSPjDHHoOQEFoh0G7cPm8SIZxk17ojWkFdM7CXlmuSN0paqMhp-4gWlfgvNq8a65I8GfY8cwVrW5KzRszHLhWYareVM3MNpejdcVH2kinEnYzBVyW0e8oN06LC2icG8FRlhOC2N8wni66liT73RvKyFFT1zW7SAoqtgn9KXY6m.EaZzSx3aapIMGpG9-S8q6mwAuwZId37ri4GTiLXp6OMABsLwT3sMUOm.Kktp.uYP1z2be2DFM6zKKPL7YJopAvdfS7TdhMfHD6Dfcv-EvK6Q0lNylaFIjegbNjPEPPXzLPdf8iwLK-dqfSe127TZcj5xJUFwo45IgFl0i0puKRIzsAtM2W3zM-TNc2HEc0nIllK.aoKZ0tF9iSekzjcNnMAvhcAKBqq6DY.qIBUs5yOoxqW4m-ga9drHp09VXIkn7st7J4IUlrMZFuVHnnzbeqD61AKKFiaRCqPee6Y88DqhsdNt7SzdA-xq9SKnJW67zsZTD0T9OoRl3.nLaSwoQ==&t=adi&prc=${censored}","tax":{"name":"test"},"hy":3020,"ny":2530,"arz":"<script type=\"text/javascript\">var _CDurl='';(function(){_CDurl=encodeURIComponent(document.URL);})();document.write('<scr' + 'ipt type=\"text/javascript\" src=\"https://censored/at?bad=&gad=&ic=EWRMh-.UTPdNvWB-JYa58c85N0fEPgXunKp3wwyPadp7jwqHgZbz4dG0A51OVO-2Gs0znYmLcPIH0ThEmpsYl8wKofo9ytJ2A3uWr9Kn-dNxeh.k8lIml9kavPk1.dk7f.46xKX7IVpf3.yU-Yx1KetQl3Q9f-iePn7B86yjVgMxkTNfhZAg0pP0kKZaJMd2orLXoV4xPXmwTdfJbWJU5bGAUROJT-Yd7yTHoVveuvOBClHzM4cgHFmGxzox6cCJ2gZB.7fqKkPzECXwdpobmO0RWxdu224-FADd.oM4DghIEpdZJe.FjEq0stQnJBT.puw0JamHgT15NdSQN7voBJ8UqGCDOu1qSLece6Iy.PN392xGWhxs0URbrWhSEgkhCr.R4ol9kjrMqK78shw2gHBJjEzKeBeo6lBzU8YfoKDM7oPlj5SwmL6sV2i2UaWJbEtreRt3oABDPab--AevfJW2rQ0-2iyt-rJSPjDHHoOQEFoh0G7cPm8SIZxk17ojWkFdM7CXlmuSN0paqMhp-4gWlfgvNq8a65I8GfY8cwVrW5KzRszHLhWYareVM3MNpejdcVH2kinEnYzBVyW0e8oN06LC2icG8FRlhOC2N8wni66liT73RvKyFFT1zW7SAoqtgn9KXY6m.EaZzSx3aapIMGpG9-S8q6mwAuwZId37ri4GTiLXp6OMABsLwT3sMUOm.Kktp.uYP1z2be2DFM6zKKPL7YJopAvdfS7TdhMfHD6Dfcv-EvK6Q0lNylaFIjegbNjPEPPXzLPdf8iwLK-dqfSe127TZcj5xJUFwo45IgFl0i0puKRIzsAtM2W3zM-TNc2HEc0nIllK.aoKZ0tF9iSekzjcNnMAvhcAKBqq6DY.qIBUs5yOoxqW4m-ga9drHp09VXIkn7st7J4IUlrMZFuVHnnzbeqD61AKKFiaRCqPee6Y88DqhsdNt7SzdA-xq9SKnJW67zsZTD0T9OoRl3.nLaSwoQ==&t=adj&prc=${censored}&tat='+_CDurl+'\"></scr' + 'ipt>');</script>"}],"tark":"1"}],"gno":"55f03d71-f021-49e0-a1a5-cae4315b3561"}`


func SendRequest() (*Response, error) { 

    url := "http://localhost:8080/foo" // dummy server

    request, _ := http.NewRequest(http.MethodPost, url, nil)

    request.Close = true

    client := &http.Client{}


    response, err := client.Do(request)

    if err != nil {

        return nil, err

    }

    defer response.Body.Close()


    resBody, err := ioutil.ReadAll(response.Body)

    if err != nil {

        return nil, err

    }


    responseModel := &Response{}

    err = json.Unmarshal(resBody, &responseModel)

    if err != nil {

        return nil, err

    }

    return responseModel, nil

}


func StartDummyServer() {

    handler := func(w http.ResponseWriter, r *http.Request) {

        fmt.Fprint(w, msg)

    }

    http.HandleFunc("/foo", handler)

    log.Fatal(http.ListenAndServe(":8080", nil))

}


func main() {

    // a dummy server is created to send the response

    go StartDummyServer()

    time.Sleep(time.Second)


    resp, err := SendRequest()

    if err != nil {

        log.Fatal(err.Error())

    }

    fmt.Println(prettyPrint(resp))


    time.Sleep(time.Second * 10)

}



func prettyPrint(i interface{}) string {

    s, _ := json.MarshalIndent(i, "", " ")

    return string(s)

}

下面是控制台输出:


{

 "tax": {

  "ver": "1.0"

 },

 "cur": "EUR",

 "rack": [

  {

   "tur": [

    {

     "zar": 2.599886212,

     "domain": [

      "test.com"

     ],

     "ney": "https://censored.com/nimp?fuid=\u0026ic=EWRMh-.UTPdNvWB-JYa58c85N0fEPgXunKp3wwyPadp7jwqHgZbz4dG0A51OVO-2Gs0znYmLcPIH0ThEmpsYl8wKofo9ytJ2A3uWr9Kn-dNxeh.k8lIml9kavPk1.dk7f.46xKX7IVpf3.yU-Yx1KetQl3Q9f-iePn7B86yjVgMxkTNfhZAg0pP0kKZaJMd2orLXoV4xPXmwTdfJbWJU5bGAUROJT-Yd7yTHoVveuvOBClHzM4cgHFmGxzox6cCJ2gZB.7fqKkPzECXwdpobmO0RWxdu224-FADd.oM4DghIEpdZJe.FjEq0stQnJBT.puw0JamHgT15NdSQN7voBJ8UqGCDOu1qSLece6Iy.PN392xGWhxs0URbrWhSEgkhCr.R4ol9kjrMqK78shw2gHBJjEzKeBeo6lBzU8YfoKDM7oPlj5SwmL6sV2i2UaWJbEtreRt3oABDPab--AevfJW2rQ0-2iyt-rJSPjDHHoOQEFoh0G7cPm8SIZxk17ojWkFdM7CXlmuSN0paqMhp-4gWlfgvNq8a65I8GfY8cwVrW5KzRszHLhWYareVM3MNpejdcVH2kinEnYzBVyW0e8oN06LC2icG8FRlhOC2N8wni66liT73RvKyFFT1zW7SAoqtgn9KXY6m.EaZzSx3aapIMGpG9-S8q6mwAuwZId37ri4GTiLXp6OMABsLwT3sMUOm.Kktp.uYP1z2be2DFM6zKKPL7YJopAvdfS7TdhMfHD6Dfcv-EvK6Q0lNylaFIjegbNjPEPPXzLPdf8iwLK-dqfSe127TZcj5xJUFwo45IgFl0i0puKRIzsAtM2W3zM-TNc2HEc0nIllK.aoKZ0tF9iSekzjcNnMAvhcAKBqq6DY.qIBUs5yOoxqW4m-ga9drHp09VXIkn7st7J4IUlrMZFuVHnnzbeqD61AKKFiaRCqPee6Y88DqhsdNt7SzdA-xq9SKnJW67zsZTD0T9OoRl3.nLaSwoQ==\u0026t=adi\u0026prc=${censored}",

     "tax": {

      "name": "test"

     },

     "hy": 3020,

     "ny": 2530,

     "arz": "\u003cscript type=\"text/javascript\"\u003evar _CDurl='';(function(){_CDurl=encodeURIComponent(document.URL);})();document.write('\u003cscr' + 'ipt type=\"text/javascript\" src=\"https://censored/at?bad=\u0026gad=\u0026ic=EWRMh-.UTPdNvWB-JYa58c85N0fEPgXunKp3wwyPadp7jwqHgZbz4dG0A51OVO-2Gs0znYmLcPIH0ThEmpsYl8wKofo9ytJ2A3uWr9Kn-dNxeh.k8lIml9kavPk1.dk7f.46xKX7IVpf3.yU-Yx1KetQl3Q9f-iePn7B86yjVgMxkTNfhZAg0pP0kKZaJMd2orLXoV4xPXmwTdfJbWJU5bGAUROJT-Yd7yTHoVveuvOBClHzM4cgHFmGxzox6cCJ2gZB.7fqKkPzECXwdpobmO0RWxdu224-FADd.oM4DghIEpdZJe.FjEq0stQnJBT.puw0JamHgT15NdSQN7voBJ8UqGCDOu1qSLece6Iy.PN392xGWhxs0URbrWhSEgkhCr.R4ol9kjrMqK78shw2gHBJjEzKeBeo6lBzU8YfoKDM7oPlj5SwmL6sV2i2UaWJbEtreRt3oABDPab--AevfJW2rQ0-2iyt-rJSPjDHHoOQEFoh0G7cPm8SIZxk17ojWkFdM7CXlmuSN0paqMhp-4gWlfgvNq8a65I8GfY8cwVrW5KzRszHLhWYareVM3MNpejdcVH2kinEnYzBVyW0e8oN06LC2icG8FRlhOC2N8wni66liT73RvKyFFT1zW7SAoqtgn9KXY6m.EaZzSx3aapIMGpG9-S8q6mwAuwZId37ri4GTiLXp6OMABsLwT3sMUOm.Kktp.uYP1z2be2DFM6zKKPL7YJopAvdfS7TdhMfHD6Dfcv-EvK6Q0lNylaFIjegbNjPEPPXzLPdf8iwLK-dqfSe127TZcj5xJUFwo45IgFl0i0puKRIzsAtM2W3zM-TNc2HEc0nIllK.aoKZ0tF9iSekzjcNnMAvhcAKBqq6DY.qIBUs5yOoxqW4m-ga9drHp09VXIkn7st7J4IUlrMZFuVHnnzbeqD61AKKFiaRCqPee6Y88DqhsdNt7SzdA-xq9SKnJW67zsZTD0T9OoRl3.nLaSwoQ==\u0026t=adj\u0026prc=${censored}\u0026tat='+_CDurl+'\"\u003e\u003c/scr' + 'ipt\u003e');\u003c/script\u003e"

    }

   ],

   "tark": "1"

  }

 ],

 "gno": "55f03d71-f021-49e0-a1a5-cae4315b3561"

}

另外,我使用了您正在使用的相同代码,在注释了请求正文部分(因为我没有它)并更改了函数签名(如下所述)之后。所有其他代码都与上面给出的代码相同。SendRequest


func SendRequest() (*Response, error) {

    responseModel := &Response{}

    // Commented off since the response body is not with me..

    // byteData, err := json.Marshal(requestModel)

    // if err != nil {

    //      zap.S().Errorf("Error marshalling request. Err: %v", err)

    //      return nil, err

    // }


    url := "http://localhost:8080/foo"

    request, _ := http.NewRequest(http.MethodPost, url /*bytes.NewBuffer(byteData)*/, nil)

    request.Close = true

    client := &http.Client{}


    response, err := client.Do(request)

    if err, ok := err.(net.Error); ok && err.Timeout() {

        log.Fatal("Response timeout exceed")

        return nil, errors.New("Response timeout exceed")

    }

    if err != nil || response == nil {

        errorMessage := "not respond"

        log.Fatal(errorMessage)

        return nil, errors.New(errorMessage)

    }


    defer response.Body.Close()

    if response.StatusCode == http.StatusOK {

        err = json.NewDecoder(response.Body).Decode(&responseModel)

        if err != nil {

            errorMessage := "Request response decode error"

            log.Printf("%v, Err: %v", errorMessage, err)

            return nil, errors.New(errorMessage)

        }

        return responseModel, nil

    } else {

        bodyBytes, _ := ioutil.ReadAll(response.Body)

        errorMessage := "not respond"

        log.Printf("%v, StatusCode %v, Response: %v\n", errorMessage, response.StatusCode, string(bodyBytes))

        return nil, errors.New(errorMessage)

    }

}

有了这个,我就能成功地解除对反应的不满。


因此,在我看来,传入的响应不正确(可能是)。尝试打印传入的数据并进行验证。


resBody, err := ioutil.ReadAll(response.Body)

if err != nil {

    return nil, err

}

fmt.Printf("%s", resBody) // 👈


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号