• 1.6k

用流+Buffer的方式从http response中读出的json数据尾部有重复,使json格式校验不通过。

用流+Buffer的方式从http response中读出的json数据尾部有重复,使json格式校验不通过。

   HttpClient hc = new HttpClient();
    hc.Timeout = new TimeSpan(1000000000);
    Console.WriteLine("defalut timeout: " + hc.Timeout);
    
    if (headMap != null && headMap.Count > 0)
    {
        foreach (string name in headMap.Keys)
        {
            hc.DefaultRequestHeaders.TryAddWithoutValidation(name, headMap[name]);
        }
    }
    var task1 = hc.GetAsync(new Uri(url));
    HttpResponseMessage responseM = task1.Result;
    Console.WriteLine(responseM);
    System.IO.Stream instream = responseM.Content.ReadAsStreamAsync().Result;
    BufferedStream bfs = new BufferedStream(instream);
    byte[] buffer = new byte[1024];
    StringBuilder sb = new StringBuilder();
    int i = 0;
    while (bfs.Read(buffer, 0, buffer.Length) > 0)
    {
        Console.WriteLine(i++);
        Console.WriteLine(Encoding.GetEncoding("UTF-8").GetString(buffer));
        sb.Append(Encoding.GetEncoding("UTF-8").GetString(buffer));
    }
    response = sb.ToString();
    
    bfs.Flush();
    bfs.Close();
    instream.Close();

clipboard.png
画绿线的部分重复了

是不是每一次 bfs.Read(buffer, 0, buffer.Length) 后都应该 bfs.flush() 一下,请大家帮忙找找其中的原因!

阅读 3.5k
评论
    1 个回答
    • 40.6k

    关键在这里

    sb.Append(Encoding.GetEncoding("UTF-8").GetString(buffer));

    你每次都是将一个完整的 buffer 加到 sb 中,然而并不是每一次 bfs.Read 都会填满整个 buffer,未被填的部分,也就是上次被填的部分也被你加到 sb 中了,造成重复的现象。

    bfs.Read() 会返回一个整数,是你这次读到的数据量,根据这个量来往 sb 中加东西吧

    int size = 0;
    while ((size = bfs.Read(buffer, 0, buffer.Lenght)) > 0) {
        // ......
        sb.Append(Encoding.UTF8.GetString(buffer, 0, size));
    }
      撰写回答

      登录后参与交流、获取后续更新提醒