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.成员变量 ...
随机推荐
- 使用ruamel.yaml库,解析yaml文件
在实现的需求如下: 同事提供了一个文本文件,内含200多个host与ip的对应关系,希望能在k8s生成pod时,将这些对应关系注入到/etc/hosts中. 网上看文档,这可以通过扩充pod中的hos ...
- Codeforces 1278F: Cards
题目传送门:CF1278F. 题意简述: 有 \(n\) 个独立随机变量 \(x_i\),每个随机变量都有 \(p = 1/m\) 的概率取 \(1\),有 \((1-p)\) 的概率取 \(0\). ...
- 在 Oracle 中使用正则表达式
Oracle使用正则表达式离不开这4个函数: 1.regexp_like 2.regexp_substr 3.regexp_instr 4.regexp_replace 看函数名称大概就能猜到有什么用 ...
- Mybatis ResultMap多表映射DTO
解决问题:n+1问题,之前我的习惯是拿到单表里面的数据,然后遍历,再拿到一个与其他表对应的逻辑上的外键,然后for循环去查找其他表的数据(原因是数据量小,没有在意,还有主要是不想建外键,你知道的,外键 ...
- zz致力于变革未来的智能技术
有 R-CNN SPPNet Fast R-CNN Faster R-CNN ... 的论文翻译 现在已经不能访问了... [私人整理]空间金字塔池化网络SPPNet详解 SPP-Net是出自 ...
- python cookbook3
1.算GC含量 def validate_base_sequence(base_sequence, RNAflag = False): #判断序列是否只含有A.T.G.C.U seq = base_s ...
- MACbook安装WIN7中文版后乱码的解决办法
控制面板→时钟.语言和区域→区域和语言→管理→更改系统区域设置→选择为中国,简体中文→确定,按照要求你重启即可. 原来这个本子是香港买的,默认区域是英语,我说怎么乱码.
- [LeetCode] 743. Network Delay Time 网络延迟时间
There are N network nodes, labelled 1 to N. Given times, a list of travel times as directededges tim ...
- [LeetCode] 29. Divide Two Integers 两数相除
Given two integers dividend and divisor, divide two integers without using multiplication, division ...
- [灯火阑珊] 关于cmd命令里的findstr匹配多个关键词
no raining now go to school and play with code 你. findstr "\<go code\>" 这样就能匹配输出包含g ...