【问题标题】:C# HttpWebRequest POST strange responseC# HttpWebRequest POST 奇怪的响应
【发布时间】:2015-07-01 12:39:13
【问题描述】:

早上好,我正在编写一个向网站 (websta.me) 发出 POST 网络请求的程序。请求有效,但问题在于响应。 我使用 Charles 分析了 http 请求,这是正常响应:

{"meta":{"code":200},"data":{"created_time":"xs","text":"xxxx <3","from":{"username":"xxxx","profile_picture":"xxxx","id":"xxxx","full_name":"xxxx"},"id":"xxxx"},"status":"OK","called_count":x}

我的程序正在返回这个:

关于如何解决这个问题的任何想法?在此先感谢您的帮助:) 如果有帮助,这是我的代码:

byte[] bytes = ASCIIEncoding.UTF8.GetBytes("comment=+xxx&media_id=xxx");
HttpWebRequest postReq = (HttpWebRequest)WebRequest.Create("http://websta.me/api/comments/xxx);
WebHeaderCollection postHeaders = postReq.Headers;
postReq.Method = "POST";
postReq.Timeout = 10000;
postReq.Host = "websta.me";
postReq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/35.0";
postReq.Accept = "application/json, text/javascript, */*; q=0.01";
postHeaders.Add("Accept-Language", "it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3");
postHeaders.Add("Accept-Encoding", "gzip, deflate");
postReq.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
postHeaders.Add("X-Requested-With", "XMLHttpRequest");
postReq.Referer = "http://websta.me/feed";
postReq.ContentLength = bytes.Length;

postReq.CookieContainer = cookies;

postReq.KeepAlive = true;

postHeaders.Add("Pragma", "no-cache");
postHeaders.Add("Cache-Control", "no-cache");
Stream postStream = postReq.GetRequestStream();
postStream.Write(bytes, 0, bytes.Length);
postStream.Close();
HttpWebResponse postResponse;
postResponse = (HttpWebResponse)postReq.GetResponse();
StreamReader reader = new StreamReader(postResponse.GetResponseStream());
MessageBox.Show(reader.ReadToEnd());

【问题讨论】:

    标签: c# post request httpwebrequest


    【解决方案1】:

    您从请求中收到的结果是 GZip 压缩数据(前三个字节是 0x1f8b08)。

    要从中获取文本,只需使用GZipStream 解压缩即可。像这样的:

    private byte[] Decompress(byte[] data)
    {
        using (GZipStream stream = new GZipStream(new MemoryStream(data), CompressionMode.Decompress))
        {
            const int size = 4096;
            byte[] buffer = new byte[size];
            using (MemoryStream memory = new MemoryStream())
            {
                int count = 0;
                do
                {
                    count = stream.Read(buffer, 0, size);
                    if (count > 0)
                    {
                        memory.Write(buffer, 0, count);
                    }
                }
                while (count > 0);
                return memory.ToArray();
            }
        }
    }
    

    然后将代码的末尾(从您得到响应的位置)修改为:

    postResponse = (HttpWebResponse)postReq.GetResponse();
    Stream Reader = postResponse.GetResponseStream();
    byte[] Data = new byte[postResponse.ContentLength];
    Reader.Read(Data, 0, Data.Length);
    Data = Decompress(Data);
    string Result = System.Text.Encoding.UTF8.GetString(Data);
    MessageBox.Show(Result);
    

    这会将响应数据(已压缩)读取到一个字节数组中,然后在将其转换为适当的文本(我相信它是来自内容类型描述的 utf-8)之前对其进行解压缩。

    请注意,GZip 解压例程取自http://www.dotnetperls.com/decompress(不是我的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-03
      • 2018-09-28
      相关资源
      最近更新 更多