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

我正在向服务器发送请求,并尝试取消对 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"`

}


可能不相关,但请求是并发的,我的测试用例仅基于一个并发请求。那么我该如何解决这个问题呢?


慕桂英4014372
浏览 133回答 1
1回答

qq_遁去的一_1

我试图在我的末端实现你的代码,它给出了预期的输出。下面给出了我尝试的代码。注意:这不是确切问题的解决方案,因为我无法重现相同的问题。// 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) {&nbsp;&nbsp; &nbsp; url := "http://localhost:8080/foo" // dummy server&nbsp; &nbsp; request, _ := http.NewRequest(http.MethodPost, url, nil)&nbsp; &nbsp; request.Close = true&nbsp; &nbsp; client := &http.Client{}&nbsp; &nbsp; response, err := client.Do(request)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; return nil, err&nbsp; &nbsp; }&nbsp; &nbsp; defer response.Body.Close()&nbsp; &nbsp; resBody, err := ioutil.ReadAll(response.Body)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; return nil, err&nbsp; &nbsp; }&nbsp; &nbsp; responseModel := &Response{}&nbsp; &nbsp; err = json.Unmarshal(resBody, &responseModel)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; return nil, err&nbsp; &nbsp; }&nbsp; &nbsp; return responseModel, nil}func StartDummyServer() {&nbsp; &nbsp; handler := func(w http.ResponseWriter, r *http.Request) {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Fprint(w, msg)&nbsp; &nbsp; }&nbsp; &nbsp; http.HandleFunc("/foo", handler)&nbsp; &nbsp; log.Fatal(http.ListenAndServe(":8080", nil))}func main() {&nbsp; &nbsp; // a dummy server is created to send the response&nbsp; &nbsp; go StartDummyServer()&nbsp; &nbsp; time.Sleep(time.Second)&nbsp; &nbsp; resp, err := SendRequest()&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; log.Fatal(err.Error())&nbsp; &nbsp; }&nbsp; &nbsp; fmt.Println(prettyPrint(resp))&nbsp; &nbsp; time.Sleep(time.Second * 10)}func prettyPrint(i interface{}) string {&nbsp; &nbsp; s, _ := json.MarshalIndent(i, "", " ")&nbsp; &nbsp; return string(s)}下面是控制台输出:{&nbsp;"tax": {&nbsp; "ver": "1.0"&nbsp;},&nbsp;"cur": "EUR",&nbsp;"rack": [&nbsp; {&nbsp; &nbsp;"tur": [&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp;"zar": 2.599886212,&nbsp; &nbsp; &nbsp;"domain": [&nbsp; &nbsp; &nbsp; "test.com"&nbsp; &nbsp; &nbsp;],&nbsp; &nbsp; &nbsp;"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}",&nbsp; &nbsp; &nbsp;"tax": {&nbsp; &nbsp; &nbsp; "name": "test"&nbsp; &nbsp; &nbsp;},&nbsp; &nbsp; &nbsp;"hy": 3020,&nbsp; &nbsp; &nbsp;"ny": 2530,&nbsp; &nbsp; &nbsp;"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"&nbsp; &nbsp; }&nbsp; &nbsp;],&nbsp; &nbsp;"tark": "1"&nbsp; }&nbsp;],&nbsp;"gno": "55f03d71-f021-49e0-a1a5-cae4315b3561"}另外,我使用了您正在使用的相同代码,在注释了请求正文部分(因为我没有它)并更改了函数签名(如下所述)之后。所有其他代码都与上面给出的代码相同。SendRequestfunc SendRequest() (*Response, error) {&nbsp; &nbsp; responseModel := &Response{}&nbsp; &nbsp; // Commented off since the response body is not with me..&nbsp; &nbsp; // byteData, err := json.Marshal(requestModel)&nbsp; &nbsp; // if err != nil {&nbsp; &nbsp; //&nbsp; &nbsp; &nbsp; zap.S().Errorf("Error marshalling request. Err: %v", err)&nbsp; &nbsp; //&nbsp; &nbsp; &nbsp; return nil, err&nbsp; &nbsp; // }&nbsp; &nbsp; url := "http://localhost:8080/foo"&nbsp; &nbsp; request, _ := http.NewRequest(http.MethodPost, url /*bytes.NewBuffer(byteData)*/, nil)&nbsp; &nbsp; request.Close = true&nbsp; &nbsp; client := &http.Client{}&nbsp; &nbsp; response, err := client.Do(request)&nbsp; &nbsp; if err, ok := err.(net.Error); ok && err.Timeout() {&nbsp; &nbsp; &nbsp; &nbsp; log.Fatal("Response timeout exceed")&nbsp; &nbsp; &nbsp; &nbsp; return nil, errors.New("Response timeout exceed")&nbsp; &nbsp; }&nbsp; &nbsp; if err != nil || response == nil {&nbsp; &nbsp; &nbsp; &nbsp; errorMessage := "not respond"&nbsp; &nbsp; &nbsp; &nbsp; log.Fatal(errorMessage)&nbsp; &nbsp; &nbsp; &nbsp; return nil, errors.New(errorMessage)&nbsp; &nbsp; }&nbsp; &nbsp; defer response.Body.Close()&nbsp; &nbsp; if response.StatusCode == http.StatusOK {&nbsp; &nbsp; &nbsp; &nbsp; err = json.NewDecoder(response.Body).Decode(&responseModel)&nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; errorMessage := "Request response decode error"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.Printf("%v, Err: %v", errorMessage, err)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return nil, errors.New(errorMessage)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return responseModel, nil&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; bodyBytes, _ := ioutil.ReadAll(response.Body)&nbsp; &nbsp; &nbsp; &nbsp; errorMessage := "not respond"&nbsp; &nbsp; &nbsp; &nbsp; log.Printf("%v, StatusCode %v, Response: %v\n", errorMessage, response.StatusCode, string(bodyBytes))&nbsp; &nbsp; &nbsp; &nbsp; return nil, errors.New(errorMessage)&nbsp; &nbsp; }}有了这个,我就能成功地解除对反应的不满。因此,在我看来,传入的响应不正确(可能是)。尝试打印传入的数据并进行验证。resBody, err := ioutil.ReadAll(response.Body)if err != nil {&nbsp; &nbsp; return nil, err}fmt.Printf("%s", resBody) // 👈
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go