C# 网络编程之 HTTP 完整攻略
在本文中,将会介绍 C# 网络编程之 HTTP,包括 HTTP 协议介绍、C# 中的 HTTP 编程以及两个示例。
HTTP 协议介绍
HTTP(HyperText Transfer Protocol),即超文本传输协议,是 Internet 上应用最为广泛的一种网络协议。HTTP 协议是基于请求和响应模式的、无状态的协议。通常由客户端发起一个请求,服务器回送响应。
HTTP 协议是一个基于 TCP/IP 协议族的应用层协议。HTTP/1.1 是目前使用最广泛的版本,但现在 HTTP/2 已经逐渐取代了 HTTP/1.x。
HTTP 请求过程
HTTP 请求的流程主要包括以下四个步骤:
- 建立连接:客户端发送连接请求到服务器端
- 发送请求:客户端向服务器端发送请求报文
- 处理请求:服务器端接收并处理请求
- 返回响应:服务器端向客户端发送响应报文
HTTP 响应格式
HTTP 响应由三部分组成:
- 状态行:包括协议版本、状态码和原因短语
- 响应头:包括服务器信息、MIME 类型、内容长度等
- 响应正文:即服务器返回的内容
C# 中的 HTTP 编程
C# 中的 HTTP 编程主要是通过 System.Net 命名空间下的相关类来实现的。其中,最重要的是 HttpWebRequest 和 HttpWebResponse。
发送 HTTP 请求
string url = "http://example.com/api/login";
string postData = "username=admin&password=123456";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postData.Length;
using (Stream reqStream = request.GetRequestStream())
{
byte[] postDataBytes = Encoding.UTF8.GetBytes(postData);
reqStream.Write(postDataBytes, 0, postDataBytes.Length);
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (Stream resStream = response.GetResponseStream())
{
StreamReader reader = new StreamReader(resStream);
string result = reader.ReadToEnd();
Console.WriteLine(result);
}
上述代码实现了向 http://example.com/api/login
发送 POST 请求,并且携带了参数 username=admin&password=123456
。注意,这个参数是字符串类型,并且需要进行编码转换,可以使用 Encoding.UTF8.GetBytes()
方法来实现。
接收 HTTP 请求
HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://localhost:8080/");
listener.Start();
while (true)
{
HttpListenerContext context = listener.GetContext();
HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response;
string responseString = "<html><body>Hello World!</body></html>";
byte[] buffer = Encoding.UTF8.GetBytes(responseString);
response.ContentLength64 = buffer.Length;
Stream output = response.OutputStream;
output.Write(buffer, 0, buffer.Length);
output.Close();
}
上述代码实现了一个简单的 HTTP 服务器,监听 http://localhost:8080/
。当有请求发生时,服务器会返回一个简单的字符串“Hello World!”。
示例一:获取网页内容
string url = "http://www.example.com/index.html";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (Stream resStream = response.GetResponseStream())
{
StreamReader reader = new StreamReader(resStream);
string result = reader.ReadToEnd();
Console.WriteLine(result);
}
上述代码实现了获取 http://www.example.com/index.html
的页面内容,并输出到控制台。需要注意的是,如果网站的页面使用了 Gzip 压缩,需要在请求头中添加 Accept-Encoding: gzip
表示支持 Gzip 压缩。
示例二:实现简单的 HTTP 服务器
HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://localhost:8080/");
listener.Start();
while (true)
{
HttpListenerContext context = listener.GetContext();
HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response;
string responseString = "Server time: " + DateTime.Now.ToString();
byte[] buffer = Encoding.UTF8.GetBytes(responseString);
response.ContentLength64 = buffer.Length;
Stream output = response.OutputStream;
output.Write(buffer, 0, buffer.Length);
output.Close();
}
上述代码实现了一个简单的 HTTP 服务器,监听 http://localhost:8080/
。当有请求发生时,服务器会返回一个字符串,表示服务器当前时间。
总结
本文介绍了 C# 网络编程之 HTTP,包括 HTTP 协议介绍、C# 中的 HTTP 编程以及两个示例。HTTP 是互联网上最常用的协议之一,具有很重要的作用,掌握 HTTP 编程是很有必要的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# 网络编程之http - Python技术站