C#-WebClient

article/2025/9/12 6:24:43
using ( var wc = new System.Net.WebClient() ) {var imagebytes = wc.DownloadData( hag.ImagePath );using ( MemoryStream ms = new MemoryStream( imagebytes ) ) {picImage.Image = Image.FromStream( ms );}
}

C#中HttpWebRequest、WebClient、HttpClient的使用

HttpWebRequest:

命名空间: System.Net,这是.NET创建者最初开发用于使用HTTP请求的标准类。使用HttpWebRequest可以让开发者控制请求/响应流程的各个方面,如 timeouts, cookies, headers, protocols。另一个好处是HttpWebRequest类不会阻塞UI线程。例如,当您从响应很慢的API服务器下载大文件时,您的应用程序的UI不会停止响应。HttpWebRequest通常和WebResponse一起使用,一个发送请求,一个获取数据。HttpWebRquest更为底层一些,能够对整个访问过程有个直观的认识,但同时也更加复杂一些。

复制代码

     //POST方法public static string HttpPost(string Url, string postDataStr){HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);request.Method = "POST";request.ContentType = "application/x-www-form-urlencoded";Encoding encoding = Encoding.UTF8;byte[] postData = encoding.GetBytes(postDataStr);request.ContentLength = postData.Length;Stream myRequestStream = request.GetRequestStream();myRequestStream.Write(postData, 0, postData.Length);myRequestStream.Close();HttpWebResponse response = (HttpWebResponse)request.GetResponse();Stream myResponseStream = response.GetResponseStream();StreamReader myStreamReader = new StreamReader(myResponseStream, encoding);string retString = myStreamReader.ReadToEnd();myStreamReader.Close();myResponseStream.Close();return retString;}//GET方法public static string HttpGet(string Url, string postDataStr){HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);request.Method = "GET";request.ContentType = "text/html;charset=UTF-8";HttpWebResponse response = (HttpWebResponse)request.GetResponse();Stream myResponseStream = response.GetResponseStream();StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));string retString = myStreamReader.ReadToEnd();myStreamReader.Close();myResponseStream.Close();return retString;}

复制代码

WebClient:

命名空间System.Net,WebClient是一种更高级别的抽象,是HttpWebRequest为了简化最常见任务而创建的,使用过程中你会发现他缺少基本的header,timeoust的设置,不过这些可以通过继承httpwebrequest来实现。相对来说,WebClient比WebRequest更加简单,它相当于封装了request和response方法,不过需要说明的是,Webclient和WebRequest继承的是不同类,两者在继承上没有任何关系。使用WebClient可能比HttpWebRequest直接使用更慢(大约几毫秒),但却更为简单,减少了很多细节,代码量也比较少。

复制代码

public class WebClientHelper{public static string DownloadString(string url){WebClient wc = new WebClient();//wc.BaseAddress = url;   //设置根目录wc.Encoding = Encoding.UTF8;    //设置按照何种编码访问,如果不加此行,获取到的字符串中文将是乱码string str = wc.DownloadString(url);return str;}public static string DownloadStreamString(string url){WebClient wc = new WebClient();wc.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36");Stream objStream = wc.OpenRead(url);StreamReader _read = new StreamReader(objStream, Encoding.UTF8);    //新建一个读取流,用指定的编码读取,此处是utf-8string str = _read.ReadToEnd();objStream.Close();_read.Close();return str;}public static void DownloadFile(string url, string filename){WebClient wc = new WebClient();wc.DownloadFile(url, filename);     //下载文件}public static void DownloadData(string url, string filename){WebClient wc = new WebClient();byte [] bytes = wc.DownloadData(url);   //下载到字节数组FileStream fs = new FileStream(filename, FileMode.Create);fs.Write(bytes, 0, bytes.Length); fs.Flush();fs.Close();}public static void DownloadFileAsync(string url, string filename){WebClient wc = new WebClient();wc.DownloadFileCompleted += DownCompletedEventHandler;wc.DownloadFileAsync(new Uri(url), filename);Console.WriteLine("下载中。。。");}private static void DownCompletedEventHandler(object sender, AsyncCompletedEventArgs e){Console.WriteLine(sender.ToString());   //触发事件的对象Console.WriteLine(e.UserState);Console.WriteLine(e.Cancelled);Console.WriteLine("异步下载完成!");}public static void DownloadFileAsync2(string url, string filename){WebClient wc = new WebClient();wc.DownloadFileCompleted += (sender, e) =>{Console.WriteLine("下载完成!");Console.WriteLine(sender.ToString());Console.WriteLine(e.UserState);Console.WriteLine(e.Cancelled);};wc.DownloadFileAsync(new Uri(url), filename);Console.WriteLine("下载中。。。");}}

复制代码

HttpClient:

HttpClient是.NET4.5引入的一个HTTP客户端库,其命名空间为 System.Net.Http ,.NET 4.5之前我们可能使用WebClient和HttpWebRequest来达到相同目的。HttpClient利用了最新的面向任务模式,使得处理异步请求非常容易。它适合用于多次请求操作,一般设置好默认头部后,可以进行重复多次的请求,基本上用一个实例可以提交任何的HTTP请求。HttpClient有预热机制,第一次进行访问时比较慢,所以不应该用到HttpClient就new一个出来,应该使用单例或其他方式获取HttpClient的实例

单例模式:

单例模式(Singleton Pattern)这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

单例创建步骤:1、定义静态私有对象;2、定义私有构造函数;3、提供公共获取对象方法;

单例模式一般分为两种实现模式:懒汉模式、饿汉模式(以下为Java代码实现)

懒汉模式:  默认不会实例化,什么时候用什么时候new

复制代码

public class Singleton {  private static Singleton instance = null;  private Singleton (){}  public static Singleton getInstance() {  if (instance == null) {  instance = new Singleton();  }  return instance;  }  
}

复制代码

这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。
这种方式 lazy loading 很明显,不要求线程安全,在多线程不能正常工作

饿汉模式:  类初始化时,会立即加载该对象,线程天生安全,调用效率高

复制代码

public class Singleton {  private static Singleton instance = new Singleton();  private Singleton (){}  public static Singleton getInstance() {  return instance;  }  
}

复制代码

双检锁/双重校验锁(DCL,即 double-checked locking):这种方式采用双锁机制,安全且在多线程情况下能保持高性能

复制代码

public class Singleton {  private volatile static Singleton singleton;  private Singleton (){}  public static Singleton getSingleton() {  if (singleton == null) {  synchronized (Singleton.class) {  if (singleton == null) {  singleton = new Singleton();  }  }  }  return singleton;  }  
}

复制代码

HttpClient:

复制代码

public class HttpClientHelper{private static readonly object LockObj = new object();private static HttpClient client = null;public HttpClientHelper() {GetInstance();}public static HttpClient GetInstance(){if (client == null){lock (LockObj){if (client == null){client = new HttpClient();}}}return client;}public async Task<string> PostAsync(string url, string strJson)//post异步请求方法{try{HttpContent content = new StringContent(strJson);content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");//由HttpClient发出异步Post请求HttpResponseMessage res = await client.PostAsync(url, content);if (res.StatusCode == System.Net.HttpStatusCode.OK){string str = res.Content.ReadAsStringAsync().Result;return str;}elsereturn null;}catch (Exception ex){return null;}}public string Post(string url, string strJson)//post同步请求方法{try{HttpContent content = new StringContent(strJson);content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");//client.DefaultRequestHeaders.Connection.Add("keep-alive");//由HttpClient发出Post请求Task<HttpResponseMessage> res = client.PostAsync(url, content);if (res.Result.StatusCode == System.Net.HttpStatusCode.OK){string str = res.Result.Content.ReadAsStringAsync().Result;return str;}elsereturn null;}catch (Exception ex){return null;}}public string Get(string url){try{var responseString = client.GetStringAsync(url);return responseString.Result;}catch (Exception ex){return null;}}}

HttpClient有预热机制,第一次请求比较慢;可以通过初始化前发送一次head请求解决:

 

_httpClient = new HttpClient() { BaseAddress = new Uri(BASE_ADDRESS) };//帮HttpClient热身_httpClient.SendAsync(new HttpRequestMessage {Method = new HttpMethod("HEAD"), RequestUri = new Uri(BASE_ADDRESS + "/") }).Result.EnsureSuccessStatusCode();

 

三者区别列表:

 


http://chatgpt.dhexx.cn/article/069VrCk7.shtml

相关文章

webclient学习1.webclient是什么?

1.webclient是什么&#xff1f; WebClient 软件包是 RT-Thread 自主研发的&#xff0c;基于 HTTP 协议的客户端的实现&#xff0c;它提供设备与 HTTP Server 的通讯的基本功能。 2.软件包功能特点 WebClient 软件包功能特点&#xff1a; 支持 IPV4/IPV6 地址 WebClient 软…

SpringBoot - 网络请求客户端WebClient使用详解

在 Spring 5 之前&#xff0c;如果我们想要调用其他系统提供的 HTTP 服务&#xff0c;通常可以使用 Spring 提供的 RestTemplate 来访问&#xff0c;不过由于 RestTemplate 是 Spring 3 中引入的同步阻塞式 HTTP 客户端&#xff0c;因此存在一定性能瓶颈。根据 Spring 官方文档…

【QString 函数学习篇】

【QString 函数学习篇】 【1】UI设计布局【2】QChar | setAlignment |【3】sprintf | asprintf | setNum | number |【4】toInt | toUpper [十进制->十六进制 | 十进制->二进制]【5】clear | append【6】二进制->十六进制 | 二进制->十进制【7】prepend【8】strimm…

Qt扫盲-QString使用总结

QString使用总结 一、概述二、初始化字符串1、极速版2、原理版 三、操作字符串1、极速版1. 增加2. 删除3. 修改4. 插入5. 转换 2、原理版 四、查询字符串五、字符串格式转换六、Null 字符串和 Empty 字符串的区别七、字符串参数格式化八、更高效的字符串构造九、最大大小和出现…

Qt之QString字符串类的详细介绍及功能函数示例用法

前序&#xff1a;为了加深对Qt各个类的认识和了解&#xff0c;决定以后再闲暇的时间对Qt类进行详细的阅读&#xff08;基于Qt cteater 的帮助文档&#xff09;&#xff0c;这样既可以提高自己的英文阅读能力&#xff0c;也可以对各个类有一个更加深入的认识和了解。 注&#xf…

QString类详解

文章目录 一、简要介绍1.1 隐式共享 二、常用方法2.1 常用构造函数2.2 字符串与数值之间的转换2.3 添加字符串2.4 大小写转换2.5 长度2.6 其他常用函数 一、简要介绍 在Qt中表示字符串的类是QString类&#xff0c;它存储字符串是采用的Unicode码&#xff0c;编码方式是使用UTF…

QString(详解)

目录 一、QString转char* 二、合并字符串 三、分割字符串 split()函数 mid(pos,n)函数 QString::section truncate(int)函数&#xff0c;从指定位置截断字符串str 四、去除字符串两端的空白 QString::trimmed()函数 QString::simplified()函数 五、查找是否包含字符…

Java——JLabel自动换行问题

┏(ω)☞ 本专栏的目录&#xff08;为您提供更好的查询方式&#xff09;&#xff08;点这里说不定有你想要的&#xff09; JLabel类可显示文本&#xff0c;一般直接添加文字会导致如下问题&#xff08;字体显示不全&#xff09;&#xff0c;在不同过增加文本框的长度的情况下可…

JLabel展示文本和图片

JLabel 构造方法 JLabel&#xff08;&#xff09;创建一个不含图像&#xff0c;不含文本的 JLabel 对象 JLabel&#xff08;String text&#xff09;使用指定的文本创建一个 JLabel 对象 JLabel&#xff08;Icon image&#xff09;创建一个具有指定图像的 JLabel 对象 pack…

java设置JLabel字体字号颜色

JLabel jl; Font f new Font("宋体",Font.PLAIN,16); jl.setFont(f); jl.setForeground(Color.red); 效果图&#xff1a;

JLabel设置背景颜色和设置文字颜色

JLabel设置背景颜色&#xff1a; JLabel light1 new JLabel("wuli"); light1.setOpaque(true); //此句是重点&#xff0c;设置背景颜色必须先将它设置为不透明的&#xff0c;因为默认是透明的。。。 light1.setBackground(Color.GREEN); JLabel设置文字颜色&…

【Java|Swing】关于JLabel换行

最近在用Swing做Windows的窗口程序&#xff0c;在使用JLabel时发现使用\n没办法换行&#xff0c;于是乎借助百度一下弄懂了JLabel是如何实现换行的。 先可以看一下使用\n的效果 JLabel labelnew JLabel("数据版本\nv1.0.0"); 运行测试 很明显&#xff0c;换行失败了…

初识JFrame、JPanel、JLabel

JFrame&#xff1a;java图形化界面设计&#xff0c;是一个顶层的框架类&#xff0c;相当于容器。好比一个窗户的框子&#xff0c;这个框子可以嵌入几个玻璃窗。 JPanel&#xff1a;也是一个容器类&#xff0c;相当于一个大玻璃窗。 JLabel&#xff1a;是一些基础组件&#xff0…

JFrame,JPanel,JLabel详解

JFrame是一个顶层的框架类&#xff0c;好比一个窗户的框子。也是一个容器类。这个框子可以嵌入几个玻璃窗。 JPanel是一个容器类&#xff0c;相当于一大玻璃窗。 JLabel等是一些基础组件&#xff0c;它必须置于某个容器里&#xff0c;类似于窗花、剪纸&#xff0c;必须置于窗户…

Java图形界面之JFrame,JLabel,JButton

Java图形界面之JFrame&#xff0c;JLabel&#xff0c;JButton 前言 ​ Java第一卷​ 图形界面第一节 JFrame package Demo03;import javax.swing.*; import java.awt.*;public class JFrame01 {public static void main(String[] args) {JFrame f new JFrame("第一个Swi…

Java GUI编程4---标签组件JLabel

1. 认识JLabel JLabel组件表示的是一个标签&#xff0c;本身是用于显示信息的&#xff0c;一般情况下是不能直接更改器显示内容的。创建完的Label对象可以通过Container类中的add()方法&#xff0c;加入到容器中&#xff0c;JLabel类的常用方法和常量如下表所示。 序号常量描…

JLabel标签较为常见部分的使用方法

本篇文章将会教会大家如何使用JLabel 1添加JLabel //创建一个标签 JLabel jLabel new JLabel("Hi,我是标签"); //添加到面板 Jpanel1.add(jLabel); //将面板添加到窗口 jFrame.add(Jpanel1);2设置文本颜色 //设置文本颜色 jLabel.setForeground(Color.green);3设…

Java基础-JLable组件、文本框组件、JPanel轻量级容器、Swing事件处理三种方式、适配器

1、JLable标签组件 标签是一种可以包含文本和图片的非交互组件&#xff0c;其文本可以是单行文本&#xff0c;也可以是 HTML 文本。对于只包含文本的标签可以使用 JLabel 类&#xff0c;该类的主要构造方法有如下几种形式。 JLabel()&#xff1a;创建无图像并且标题为空字符串…

06.JavaSwing(基础组件——JLabel类)

软件界面是软件和用户之间的交流平台&#xff0c;而组件则是绘制软件界面的基本元素&#xff0c;是软件和用户之间的交流要素。 一、概述 JLabel组件用来显示文本和图像&#xff0c;可以只显示其一种&#xff0c;也可以同时显示。JLabel类提供了一些列用来设置标签的方法。 二…

从DTW到DILATE---时序预测损失函数总结

时间序列预测损失函数 时间序列预测是指通过分析历史数据来预测未来数据的变化趋势。时间序列预测在许多领域都有着广泛的应用&#xff0c;例如金融、气象、交通等。为了能够准确预测未来数据&#xff0c;时间序列预测中损失函数的选择非常关键。损失函数的选择直接影响模型的…