C# HttpWebRequest和WebClient的区别 通过WebClient/HttpWebRequest实现http的post/get方法
- 一 HttpWebReques
1,HttpWebRequest是个抽象类,所以无法new的,需要调用HttpWebRequest.Create();
2,其Method指定了请求类型,这里用的GET,还有POST;也可以指定ConentType;
3,其请求的Uri必须是绝对地址;
4,其请求是异步回调方式的,从BeginGetResponse开始,并通过AsyncCallback指定回调方法;
二 WebClient
1,WebClient 方式使用基于事件的异步编程模型,在HTTP响应返回时引发的WebClient回调是在UI线程中调用的,因此可用于更新UI元素的属性,
例如把 HTTP响应中的数据绑定到UI的指定控件上进行显示。HttpWebRequest是基于后台进程运行的,回调不是UI线程,所以不能直接对UI进行操作,通常使用Dispatcher.BeginInvoke()跟界面进行通讯。
- //body是要传递的参数,格式"roleId=1&uid=2"
- //post的cotentType填写:
- //"application/x-www-form-urlencoded"
- //soap填写:"text/xml; charset=utf-8"
- public static string PostHttp(string url, string body, string contentType)
- {
- HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
- httpWebRequest.ContentType = contentType;
- httpWebRequest.Method = "POST";
- httpWebRequest.Timeout = ;
- byte[] btBodys = Encoding.UTF8.GetBytes(body);
- httpWebRequest.ContentLength = btBodys.Length;
- httpWebRequest.GetRequestStream().Write(btBodys, , btBodys.Length);
- HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
- StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream());
- string responseContent = streamReader.ReadToEnd();
- httpWebResponse.Close();
- streamReader.Close();
- httpWebRequest.Abort();
- httpWebResponse.Close();
- return responseContent;
- }
- POST方法(httpWebRequest)
POST方法(httpWebRequest)
- /// <summary>
- /// 通过WebClient类Post数据到远程地址,需要Basic认证;
- /// 调用端自己处理异常
- /// </summary>
- /// <param name="uri"></param>
- /// <param name="paramStr">name=张三&age=20</param>
- /// <param name="encoding">请先确认目标网页的编码方式</param>
- /// <param name="username"></param>
- /// <param name="password"></param>
- /// <returns></returns>
- public static string Request_WebClient(string uri, string paramStr, Encoding encoding, string username, string password)
- {
- if (encoding == null)
- encoding = Encoding.UTF8;
- string result = string.Empty;
- WebClient wc = new WebClient();
- // 采取POST方式必须加的Header
- wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
- byte[] postData = encoding.GetBytes(paramStr);
- if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
- {
- wc.Credentials = GetCredentialCache(uri, username, password);
- wc.Headers.Add("Authorization", GetAuthorization(username, password));
- }
- byte[] responseData = wc.UploadData(uri, "POST", postData); // 得到返回字符流
- return encoding.GetString(responseData);// 解码
- }
- POST方法(WebClient)
POST方法(WebClient)
- public static string GetHttp(string url, HttpContext httpContext)
- {
- string queryString = "?";
- foreach (string key in httpContext.Request.QueryString.AllKeys)
- {
- queryString += key + "=" + httpContext.Request.QueryString[key] + "&";
- }
- queryString = queryString.Substring(, queryString.Length - );
- HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url + queryString);
- httpWebRequest.ContentType = "application/json";
- httpWebRequest.Method = "GET";
- httpWebRequest.Timeout = ;
- //byte[] btBodys = Encoding.UTF8.GetBytes(body);
- //httpWebRequest.ContentLength = btBodys.Length;
- //httpWebRequest.GetRequestStream().Write(btBodys, 0, btBodys.Length);
- HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
- StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream());
- string responseContent = streamReader.ReadToEnd();
- httpWebResponse.Close();
- streamReader.Close();
- return responseContent;
- }
- Get方法(HttpWebRequest)
Get方法(HttpWebRequest)
- /// <summary>
- /// 通过 WebRequest/WebResponse 类访问远程地址并返回结果,需要Basic认证;
- /// 调用端自己处理异常
- /// </summary>
- /// <param name="uri"></param>
- /// <param name="timeout">访问超时时间,单位毫秒;如果不设置超时时间,传入0</param>
- /// <param name="encoding">如果不知道具体的编码,传入null</param>
- /// <param name="username"></param>
- /// <param name="password"></param>
- /// <returns></returns>
- public static string Request_WebRequest(string uri, int timeout, Encoding encoding, string username, string password)
- {
- string result = string.Empty;
- WebRequest request = WebRequest.Create(new Uri(uri));
- if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
- {
- request.Credentials = GetCredentialCache(uri, username, password);
- request.Headers.Add("Authorization", GetAuthorization(username, password));
- }
- if (timeout > )
- request.Timeout = timeout;
- WebResponse response = request.GetResponse();
- Stream stream = response.GetResponseStream();
- StreamReader sr = encoding == null ? new StreamReader(stream) : new StreamReader(stream, encoding);
- result = sr.ReadToEnd();
- sr.Close();
- stream.Close();
- return result;
- }
- #region # 生成 Http Basic 访问凭证 #
- private static CredentialCache GetCredentialCache(string uri, string username, string password)
- {
- string authorization = string.Format("{0}:{1}", username, password);
- CredentialCache credCache = new CredentialCache();
- credCache.Add(new Uri(uri), "Basic", new NetworkCredential(username, password));
- return credCache;
- }
- private static string GetAuthorization(string username, string password)
- {
- string authorization = string.Format("{0}:{1}", username, password);
- return "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(authorization));
- }
- #endregion
- basic验证的WebRequest/WebResponse
basic验证的WebRequest/WebResponse
C# HttpWebRequest和WebClient的区别 通过WebClient/HttpWebRequest实现http的post/get方法的更多相关文章
- HttpWebRequest和WebClient的区别
HttpWebRequest和WebClient的区别(From Linzheng): 1,HttpWebRequest是个抽象类,所以无法new的,需要调用HttpWebRequest.Creat ...
- jquery的offset().top和js的offsetTop的区别,以及jquery的offset().top的实现方法
jquery的offset().top和js的offsetTop的区别,以及jquery的offset().top的实现方法 offset().top是JQ的方法,需要引入JQ才能使用,它获取的是你绑 ...
- WebClient, HttpClient, HttpWebRequest ,RestSharp之间的区别与抉择
NETCore提供了三种不同类型用于生产的REST API: HttpWebRequest;WebClient;HttpClient,开源社区创建了另一个名为RestSharp的库.如此多的http库 ...
- HttpWebRequest、HttpWebResponse、HttpClient、WebClient等http网络访问类的使用示例汇总
工作中长期需要用到通过HTTP调用API以及文件上传下载,积累了不少经验,现在将各种不同方式进行一个汇总. 首先是HttpWebRequest: /// <summary> /// 向服务 ...
- 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方法详解
本文是精讲响应式WebClient第2篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 在上一篇文章为大家介绍了响应式IO模型和WebClient的基本 ...
- 方法的重写与重载的区别(Override与Overload)。重载的方法是否可以改变返回值的类型
方法的重写(Override)与重载(Overload)的区别.重载的方法是否可以改变返回值的类型?[基础] 解释: 方法的重写overriding和重载Overloading是Java多态性的不同表 ...
- (转载)Recyclerview | Intent与Bundle在传值上的区别 | 设置布局背景为白色的三种方法
用Recyclerview实现列表分组.下拉刷新以及上拉加载更多 http://www.jianshu.com/p/be62ce21ea57 Intent与Bundle在传值上的区别http://b ...
- HTTPWebrequest上传文件--Upload files with HTTPWebrequest (multipart/form-data)
使用HTTPWebrequest上传文件遇到问题,可以参考Upload files with HTTPWebrequest (multipart/form-data)来解决 https://stack ...
- Java基础(42):Java中主类中定义方法加static和不加static的区别(前者可以省略类名直接在主方法调用,后者必须先实例化后用实例调用)
package lsg.ap.april4th2; /* 知识点:1.Getter and Setter 的应用 2.局部变量与成员变量(也可叫做全局变量) 3.Static关键字的用法 a.成员变量 ...
随机推荐
- 简单使用:SpringBoot使用freemarker
使用步骤: a : 添加依赖 b: 创建模板文件 保存位置resources/templates 目录下 文件后缀名.ftl c 编写controller 把结果传递给模板 在resources.te ...
- Python从零开始——集合Set
一:Python集合知识概览 二:Python的特性.格式.以及各序列结构对比 三:Python集合set的创建 四:集合常用操作之——添加元素 五:集合常见操作之——删除元素 六:集合常见操作之—— ...
- 其他综合-CentOS 7 使用二进制包搭建lnmp平台
CentOS 7 使用二进制包搭建lnmp平台 1.实验描述 通过二进制搭建 lnmp 平台,实现 web 环境基本部署 2.实验环境 虚拟机: 系统:CenOS 7.6 内存:2 G+ 数量:1台 ...
- AssetBundleMaster_ReadMe_CN
在开始使用之前, 建议先导入到一个空的工程里, 通过ReadMe的一步步引导使你对整个框架以及文件结构进行熟悉, 之后再考虑导入到现有工程中使用, 完整看完教程大概需要2个小时左右. 先看看文件夹结构 ...
- C语言的暂停
#include<stdio.h> int main(void) { printf("Hello, World!\n"); system("pause&quo ...
- 错误: 找不到或无法加载主类 com.leyou.LeyouItemApplication Process finished with exit code 1
在IDEA的使用过程中,经常断掉服务或者重启服务,最近断掉服务重启时突然遇到了一个启动报错: 错误:找不到或无法加载主类 猜测:1,未能成功编译: 尝试:菜单--->Build--->Re ...
- String强制转换为Date,freemarker标签里date数据的显示问题
String强制转换为Date,freemarker标签里date数据的显示问题 http://blog.sina.com.cn/s/blog_617f5d090101ut63.html (2014- ...
- 交换机端口与Mac地址绑定(基于Cisco模拟器)
实验设备: 二层交换机一台,主机三台 实验步骤: 1.进入相应的接口 (以端口1设置Mac地址绑定,PC0接1端口举例) Switch>enable Switch#config Configur ...
- eclipse中查找类、方法及变量被引用的地方
1.选中要查看的类.方法或变量,然后Ctrl+Shift+G或右键-->References--->Project,就可以找到它所有被引用的地方. 2.对于方法,还可以通过右键--> ...
- Linux ssh 密钥创建与验证
1.需要两个虚拟机,每一个创建一个用户登录到用户根下 2.每个用户都要创建密钥对 3.把两个用户的公用密钥用ssh-copy-id -i 命令将公用的密钥复制到另一个用户中 4.在客户端开 ...