我有这个代码,调用this sample API call of the game Guild Wars 2
HttpWebRequest request = HttpWebRequest.Create("https://api.guildwars2.com/v1/events.json?world_id=1001") as HttpWebRequest;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
byte[] bytes = new byte[response.ContentLength];
Stream stream = response.GetResponseStream();
stream.Read(bytes, 0, bytes.Length);
string result = Encoding.Default.GetString(bytes);
这是对官方Guild Wars 2 API的示例调用,应该以JSON格式返回事件列表及其状态。
如果您在浏览器中调用该地址并将数据粘贴到文本编辑器中,它会提供正确的JSON字符串,大小超过300 kb。
但是,当被此代码调用并查看生成的字节数组时,前3800-3900个字节被正确填充(数字在调用之间略有不同),但其余部分全部为零。
response.ContentLength表示流的正确长度,略大于300k,并且使用stream.ReadByte()测试告诉我流确实提供了300k,在3850字节标记之后它只是零。
我的代码中是否有错误,或者是什么原因导致此问题?我可以用另一种方式调用API来获得正确的完整响应吗?
答案 0 :(得分:3)
流上的Read
操作返回实际读取的字节数。你应该继续调用stream.Read()
直到它返回0.数据还没有到达。
Read
不会阻止的原因是某些应用程序可能已经开始处理部分数据。
您可以使用以下代码:
HttpWebRequest request = HttpWebRequest.Create("https://api.guildwars2.com/v1/events.json?world_id=1001") as HttpWebRequest;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
byte[] bytes;
using (Stream stream = response.GetResponseStream())
using (MemoryStream buffer = new MemoryStream((int)response.ContentLength))
{
byte[] chunk = new byte[4096];
int bytesRead;
while ((bytesRead = stream.Read(chunk, 0, chunk.Length)) > 0)
{
buffer.Write(chunk, 0, bytesRead);
}
bytes = buffer.ToArray();
}