HttpClient, 使用C#操作Web
我们知道, .Net类库里提供了HttpWebRequest等类,方便我们编程与Web服务器进行交互. 但是实际使用中我们经常会遇到以下需求,基础类里没有直接提供相应的功能(WebClient类包含这些功能,只是用起来稍微麻烦一点--谢谢网友东吴居士的提醒):
- 对HttpWebResponse获取的HTML进行文字编码转换,使之不会出现乱码;
- 自动在Session间保持Cookie,Referer等相关信息;
- 模拟HTML表单提交;
- 向服务器上传文件;
- 对二进制的资源,直接获取返回的字节数组(byte[]),或者保存为文件
为了解决这些问题,我开发了HttpClient类.下面是使用的方法:
- 获取编码转换后的字符串
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.
计划中还有另外一些功能要加进来,比如断点续传, 多线程下载, 下载进度更新的事件机制等, 正在思考如何与现在的代码融合到一起,期待你的反馈.
你可以从这里下载目前版本的全部代码.
注意:使用时应该添加对System.Web.dll的引用,并在使用此类的代码前添加"using System.Web;",不然会无法通过编译(感谢Hyke的提醒).
[update:2007年8月11日]
- 修复了一个与文件上传相关的bug;
- 听从大家的意见,给公开方法和属性添加了XML注释;
- 添加了断点续传的支持功能(还需要考虑一下怎么做能让使用更方便).
- 修复了一个与Post相关的bug
HttpClient, 使用C#操作Web相关推荐
- 使用HttpClient消费ASP.NET Web API服务
本篇体验使用HttpClient消费ASP.NET Web API服务,例子比较简单. 依次点击"文件","新建","项目". 选择&quo ...
- 【ctf-2】密码学-文件操作-Web前端
本周进行了多方面的学习,进一步了解了ctf的知识,同时对密码学的同余知识.文件操作.Web前端也有了巩固的认知. 在同余中知道了Euler定理,想必这也是日后比较重要的算法基础:在文件操作中,首次进入 ...
- java调用asp.net webapi_通过HttpClient 调用ASP.NET Web API示例
在前面两篇文章中我们介绍了ASP.NET Web API的基本知识和原理,并且通过简单的实例了解了它的基本(CRUD)操作.我们是通过JQuery和Ajax对Web API进行数据操作.这一篇我们来介 ...
- C#使用HttpClient进行http操作
简介 在.Net 4.5中增加了一个新的System.Net.Http.HttpClient名字空间(在 System.Net.Http.dll 中).其中 提供了用于发送 HTTP 请求和接收 HT ...
- python的前端个web的前端有什么区别_用Python 操作Web 前端 基础
一,目录 1. HTML : html就是一套浏览器认识的规则,主要用20个左右的标签 对于开发者来说:学习html规则 1. 本地测试:(1)找到html文件,直接浏览器方式打开,不用socket: ...
- 选择、操作web元素-2
11月3日 等待web元素的出现 例子:百度搜索松勤网,点击操作后不等待页面刷新,下面选择页面元素的时候,该元素还是未出现 sleep方案的弊病:固定的等待时间,导致测试用例执行时间很长 为什么cli ...
- delphi操作webbrowser htmldocument,操作web界面
原文地址:https://www.cnblogs.com/endv/p/5983110.html {IHTMLDocument2 方法:} write //写入 writeln //写入并换行 ope ...
- 图灵机器人php调用案例,使用httpclient实现图灵机器人web api调用实例
本人在使用图灵机器人的过程中,发现很不错,想试了通过api请求来获取回复,这样可以做一个页面聊天还是很不错的.网上搜到的文章好多都是get接口,现在已经不能用了,也不用urlencodeer方法处理i ...
- 5.QT中关于HTTPClient相关的操作,Json数据传输
新建项目T12HttpClient T12HttpClient.pro SOURCES += \ main.cpp QT += network CONFIG += C++11 main.cpp ...
最新文章
- Apache的管理及优化web
- Spring事务属性详解
- 3.2 矩阵和图像类型
- CFX计算报错和相应解决办法(浮点错误等-持续更新)
- 计算机系统结构——概述
- (转)android技巧01:Preferencescreen中利用intent跳转activity
- Java中的继承与组合
- 自从有了这个工具,一键代码迁移不在话下
- docker 与宿主共享文件
- 如果conda找不到想要安装的库怎么办PackagesNotFoundError: The following packages are not available from current
- 程序员分析了 50 万条拼多多商品数据,告诉你到底是消费升级还是降级!
- APT入门知识:抗击APT和针对性攻击
- 纠错码较副本优势与minio纠错码配置
- 阿里开源软件替换指南 1
- 原型设计 + 用户规格说明书
- 名编辑电子杂志大师教程 | 添加页码
- keil5错误error: A1355U: A Label was found which was in no AREA 终级解决办法
- 这些强大的数据分析软件你都知道吗?
- PostgreSQL-12 通过归档WAL日志同步主备数据
- KISS原则(Kiss Principle)
热门文章
- C++floyd warshall算法求最短路径(附完整源码)
- C语言以递归实现插入排序Insertion Sort算法(附完整源码)
- C++预处理程序指令
- C++11类内初始化
- c语言整行乘非整形等于什么意思,C语言--整形升级寻常算术转换
- 2.1.决策树和随机森林
- 01_初识Matplotlib、Figure的组成、绘图函数的输入类型、第一个例子(学习笔记)
- 二十种实战调优MySQL性能优化的经验(转自公众号:架构之家 2018-05-08)
- SpringBoot中Tomcat配置(学习SpringBoot实战)
- fiddler几种功能强大的用法(一)转自:http://www.cnblogs.com/chenshaoping/p/5785010.html