获取需要登陆才能被访问的页面,HttpClient(扩展HttpWebRequest)来实现
2008-01-04 17:17
841 查看
文章来自/article/4778830.html
使用
HttpClient client = new HttpClient("[登陆页面地址]?username=aaa&password=bbb", null, true); //最后一个参数true,表示保存返回的Cookies,
string html=client.GetString();//发出请求,返回结果字符串;
client.url=searchurl; //searchurl为查询页面,在该url后连上对应的查询条件即可完成查询
string html=client.GetString();
然后可以通过正则表达式,根据指定的字符串模型返回需要的部分
/// <summary>
/// 在源字符串中查找前置字符串为left,后置字符串为right的内容
/// </summary>
/// <param name="source">源字符串</param>
/// <param name="condition">条件字符串,由前置字符串+<%%>+后置字符串组成</param>
/// <param name="right">后置字符串</param>
/// <param name="index">要返回的结果集合中的子项</param>
/// <returns></returns>
public static string FindSubString(string source,string condition,int index)
{
string regexString = condition.Replace("<%%>", @"([\s\S]*?)");
Match m = null;
m = Regex.Match(source, regexString);
return m.Groups[index].Value;
}
获取编码转换后的字符串
HttpClient client=new HttpClient(url);
string html=client.GetString();
GetString()函数内部会查找Http Headers, 以及HTML的Meta标签,试图找出获取的内容的编码信息.如果都找不到,它会使用client.DefaultEncoding, 这个属性默认为utf-8, 也可以手动设置.
自动保持Cookie, Referer
HttpClient client=new HttpClient(url1, null, true);
string html1=client.GetString();
client.Url=url2;
string html2=client.GetString();
这里HttpClient的第三个参数,keepContext设置为真时,HttpClient会自动记录每次交互时服务器对Cookies进行的操作,同时会以前一次请求的Url为Referer.在这个例子里,获取html2时,会把url1作为Referer, 同时会向服务器传递在获取html1时服务器设置的Cookies. 当然,你也可以在构造HttpClient时直接提供第一次请求要发出的Cookies与Referer:
HttpClient client=new HttpClient(url, new WebContext(cookies, referer), true);
或者,在使用过程中随时修改这些信息:
client.Context.Cookies=cookies;
client.Context.referer=referer;
模拟HTML表单提交
HttpClient client=new HttpClient(url);
client.PostingData.Add(fieldName1, filedValue1);
client.PostingData.Add(fieldName2, fieldValue2);
string html=client.GetString();
上面的代码相当于提交了一个有两个input的表单. 在PostingData非空,或者附加了要上传的文件时(请看下面的上传和文件), HttpClient会自动把HttpVerb改成POST, 并将相应的信息附加到Request上.
向服务器上传文件
HttpClient client=new HttpClient(url);
client.AttachFile(fileName, fieldName);
client.AttachFile(byteArray, fileName, fieldName);
string html=client.GetString();
这里面的fieldName相当于<input type="file" name="fieldName" />里的fieldName. fileName当然就是你想要上传的文件路径了. 你也可以直接提供一个byte[] 作为文件内容, 但即使如此,你也必须提供一个文件名,以满足HTTP规范的要求.
不同的返回形式
字符串: string html = client.GetString();
流: Stream stream = client.GetStream();
字节数组: byte[] data = client.GetBytes();
保存到文件: client.SaveAsFile(fileName);
或者,你也可以直接操作HttpWebResponse: HttpWebResponse res = client.GetResponse();
每调用一次上述任何一个方法,都会导致发出一个HTTP Request, 也就是说,你不能同时得到某个Response的两种返回形式.
另外,调用后它们任意一个之后,你可以通过client.ResponseHeaders来获取服务器返回的HTTP头.
下载资源的指定部分(用于断点续传,多线程下载)
HttpClient client=new HttpClient(url);
//发出HEAD请求,获取资源长度
int length=client.HeadContentLength();
//只获取后一半内容
client.StartPoint=length/2;
byte[] data=client.GetBytes();
HeadContentLength()只会发出HTTP HEAD请求.根据HTTP协议, HEAD与GET的作用等同, 但是,只返回HTTP头,而不返回资源主体内容. 也就是说,用这个方法,你没法获取一个需要通过POST才能得到的资源的长度,如果你确实有这样的需求,建议你可以通过GetResponse(),然后从ResponseHeader里获取Content-Length.
使用
HttpClient client = new HttpClient("[登陆页面地址]?username=aaa&password=bbb", null, true); //最后一个参数true,表示保存返回的Cookies,
string html=client.GetString();//发出请求,返回结果字符串;
client.url=searchurl; //searchurl为查询页面,在该url后连上对应的查询条件即可完成查询
string html=client.GetString();
然后可以通过正则表达式,根据指定的字符串模型返回需要的部分
/// <summary>
/// 在源字符串中查找前置字符串为left,后置字符串为right的内容
/// </summary>
/// <param name="source">源字符串</param>
/// <param name="condition">条件字符串,由前置字符串+<%%>+后置字符串组成</param>
/// <param name="right">后置字符串</param>
/// <param name="index">要返回的结果集合中的子项</param>
/// <returns></returns>
public static string FindSubString(string source,string condition,int index)
{
string regexString = condition.Replace("<%%>", @"([\s\S]*?)");
Match m = null;
m = Regex.Match(source, regexString);
return m.Groups[index].Value;
}
获取编码转换后的字符串
HttpClient client=new HttpClient(url);
string html=client.GetString();
GetString()函数内部会查找Http Headers, 以及HTML的Meta标签,试图找出获取的内容的编码信息.如果都找不到,它会使用client.DefaultEncoding, 这个属性默认为utf-8, 也可以手动设置.
自动保持Cookie, Referer
HttpClient client=new HttpClient(url1, null, true);
string html1=client.GetString();
client.Url=url2;
string html2=client.GetString();
这里HttpClient的第三个参数,keepContext设置为真时,HttpClient会自动记录每次交互时服务器对Cookies进行的操作,同时会以前一次请求的Url为Referer.在这个例子里,获取html2时,会把url1作为Referer, 同时会向服务器传递在获取html1时服务器设置的Cookies. 当然,你也可以在构造HttpClient时直接提供第一次请求要发出的Cookies与Referer:
HttpClient client=new HttpClient(url, new WebContext(cookies, referer), true);
或者,在使用过程中随时修改这些信息:
client.Context.Cookies=cookies;
client.Context.referer=referer;
模拟HTML表单提交
HttpClient client=new HttpClient(url);
client.PostingData.Add(fieldName1, filedValue1);
client.PostingData.Add(fieldName2, fieldValue2);
string html=client.GetString();
上面的代码相当于提交了一个有两个input的表单. 在PostingData非空,或者附加了要上传的文件时(请看下面的上传和文件), HttpClient会自动把HttpVerb改成POST, 并将相应的信息附加到Request上.
向服务器上传文件
HttpClient client=new HttpClient(url);
client.AttachFile(fileName, fieldName);
client.AttachFile(byteArray, fileName, fieldName);
string html=client.GetString();
这里面的fieldName相当于<input type="file" name="fieldName" />里的fieldName. fileName当然就是你想要上传的文件路径了. 你也可以直接提供一个byte[] 作为文件内容, 但即使如此,你也必须提供一个文件名,以满足HTTP规范的要求.
不同的返回形式
字符串: string html = client.GetString();
流: Stream stream = client.GetStream();
字节数组: byte[] data = client.GetBytes();
保存到文件: client.SaveAsFile(fileName);
或者,你也可以直接操作HttpWebResponse: HttpWebResponse res = client.GetResponse();
每调用一次上述任何一个方法,都会导致发出一个HTTP Request, 也就是说,你不能同时得到某个Response的两种返回形式.
另外,调用后它们任意一个之后,你可以通过client.ResponseHeaders来获取服务器返回的HTTP头.
下载资源的指定部分(用于断点续传,多线程下载)
HttpClient client=new HttpClient(url);
//发出HEAD请求,获取资源长度
int length=client.HeadContentLength();
//只获取后一半内容
client.StartPoint=length/2;
byte[] data=client.GetBytes();
HeadContentLength()只会发出HTTP HEAD请求.根据HTTP协议, HEAD与GET的作用等同, 但是,只返回HTTP头,而不返回资源主体内容. 也就是说,用这个方法,你没法获取一个需要通过POST才能得到的资源的长度,如果你确实有这样的需求,建议你可以通过GetResponse(),然后从ResponseHeader里获取Content-Length.
相关文章推荐
- 使用HttpWebRequest和HttpWebResponse实现模拟登录需要登陆后才可以访问的页面
- dnn 模块 获取服务器端路径、获取用户ID、需要登陆才能访问的页面的处理
- c#第一篇 在WPF的window窗体中使用httpwebrequest实现模拟登陆网页,并在webbroser控件中显示
- C#实现通过HttpWebRequest发送POST请求实现网站自动登陆
- C#通过WebClient/HttpWebRequest实现http的post/get方法
- 在webForm中WebRequest\WebClient\WebBrowser获取远程页面源码的三种方式(downmoon)
- C#、VB.NET使用HttpWebRequest访问https地址(SSL)的实现
- 【转】C#多线程环境下调用 HttpWebRequest 并发连接限制 HttpClient是否有默认并发数限制? 在.Net 4.0之前,一直是依靠HttpWebRequest实现Htt
- 在 Action 中访问 WEB 资源(struts2获取HttpServletRequest, HttpSession, ServletContext)
- C#通过WebClient/HttpWebRequest实现http的post/get方法
- 实现IHttpModule接口获取Session来实现页面访问日志功能。
- 通过HttpWebRequest 发送 POST 请求实现自动登陆
- 利用HttpWebRequest和HttpWebResponse获取Cookie并实现模拟登录
- [转]C#、VB.NET使用HttpWebRequest访问https地址(SSL)的实现
- HttpWebRequest 获取验证码的图片 并针对有验证码的网页进行Winform登陆。
- 利用HttpWebRequest来实现提交和获取网页数据
- 利用HttpWebRequest和HttpWebResponse获取Cookie并实现模拟登录
- 获取WebBrowser全cookie 和 httpWebRequest 异步获取页面数据
- HttpClient和HtmlParser配合实现自动登陆系统抽取页面信息
- 通过HttpWebRequest 发送 POST 请求实现自动登陆