5.4 逐行返回HTTP响应的内容
问题
如何逐行返回一个HTTP响应的内容,而不是把整个内容作为一个字符串。
设计
通过HttpWebRequest.GetResponse()方法获得HTTP响应的数据流(stream),并且把这个stream传给StreamReader()的构造函数。然后在一个while循环中通过StreamReader.ReadLine()方法进行逐行读取。
方案
// 通过WebClient 类、WebRequest类、或者HttpWebRequest类发送HTTP请求
Stream st = null;
// 通过WebClient.OpenRead()方法、WebRequest.GetResponseStream()方法
// 或者HttpWebRequest.GetResponse()把Stream st连接到HTTP响应
StreamReader sr = new StreamReader(st);
string line = null;
Console.WriteLine("HTTP response line-by-line: ");
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
sr.Close();
st.Close();
注解
用于发送HTTP请求的三种基本方法(WebClient、WebRequest、HttpWebRequest)都支持通过某个方法以Stream对象的形式返回与它们相关联的HTTP响应。这个Stream对象可以与一个StreamReader对象相关联,而StreamReader对象可以有好几种方法取回流数据。使用StreamReader.ReadToEnd()方法 ,可以把HTTP响应作为一个大字符串返回。对许多自动化测试场景来说,这样做就可以了,但是有时候你可能想要以每次一行的方式取回HTTP响应。比如说,如果返回的响应内容非常多,你可能不想把它存储在一个大字符串里。或者你想在HTTP响应里查找一个目标字符串,逐行查找有时候会更高效。如果要进行逐行查找,你可以在一个while循环里使用StreamReader.ReadLine() 方法。ReadLine()方法读入它所碰到的所有字符,直到碰到换行符,然后返回。如果没有读到字符,它会返回null。
除了采取每次读入一行的方法来取回HTTP响应,也可以每次读入固定长度的一组字符:
// 把响应数据流连接到Stream st
// 把st连接到StreamReader sr
char[] block = new char[3];
int ct = 0;
while ((ct = sr.Read(block, 0, 3)) != 0)
{
for (int i = 0; i < ct; i++)
Console.Write(block[i] + " ");
}
当想要按字符(而不是按行或字符串)来检查HTTP响应时,上面这段代码是很有用的。在这个例子中,首先声明一个大小为3的字符数组用来存储取回的响应。StreamReader.Read()方法读入3个字符(如果数据流里不足3个字符,则读入剩下的全部字符),并且把这些字符存储到
从下标0开始的字符数组里面,然后返回实际读入的字符个数。如果读入字符的个数为0,则意味着数据流已经读完,可以退出while循环了。请注意,如果把字符数组的大小声明为1,则意味着每次读入1个字符。







