📅  最后修改于: 2023-12-03 15:25:27.546000             🧑  作者: Mango
在一些场景下,我们需要向服务器发送一些数据或文件,这时候就需要使用 HTTP POST 请求。C# 提供了很多方式来发送 HTTP POST 请求,例如使用 HttpWebRequest
或 WebClient
等。
使用 HttpWebRequest
发送 POST 请求需要以下步骤:
HttpWebRequest
对象,设置请求 URL 和请求方法为 POST。下面展示一个带有文件的 HTTP POST 请求示例:
string url = "https://example.com/upload";
string filePath = @"C:\Users\JohnDoe\Documents\example.png";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
request.ContentType = "multipart/form-data; boundary=" + boundary;
Stream requestStream = request.GetRequestStream();
FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[4096];
int bytesRead;
string fileHeader = $"--{boundary}\r\nContent-Disposition: form-data; name=\"file\"; filename=\"{Path.GetFileName(filePath)}\"\r\nContent-Type: image/png\r\n\r\n";
byte[] fileHeaderBytes = Encoding.UTF8.GetBytes(fileHeader);
requestStream.Write(fileHeaderBytes, 0, fileHeaderBytes.Length);
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
{
requestStream.Write(buffer, 0, bytesRead);
}
string boundaryFooter = $"\r\n--{boundary}--\r\n";
byte[] boundaryFooterBytes = Encoding.UTF8.GetBytes(boundaryFooter);
requestStream.Write(boundaryFooterBytes, 0, boundaryFooterBytes.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
在此示例中,我们首先定义了 url
和 filePath
两个参数,分别代表请求 URL 和文件路径。然后我们通过 HttpWebRequest.Create
方法创建了 HttpWebRequest
对象,并设置了请求方法为 POST。
我们在第 3 行创建了一个字符串 boundary
,它用于分隔请求的不同部分。我们将请求的内容类型设置为 multipart/form-data
,并在其中添加了 boundary
参数。
在第 8 行,我们调用了 request.GetRequestStream
方法获取请求写入流,并创建了一个 FileStream
对象读取文件数据。我们使用 buffer
字节数组来读取文件数据,每次最多读取 4096 个字节,然后将读取到的字节写入请求写入流。
在第 15 行,我们设置了请求结束的 boundary
并将其写入请求写入流。最后,我们调用 request.GetResponse
方法发送请求并获取响应。
另外一种发送 HTTP POST 请求的方法是使用 WebClient
。这种方式比较简单,只需要一行代码即可完成请求。
下面是一个使用 WebClient
发送带有文件的 HTTP POST 请求的示例:
string url = "https://example.com/upload";
string filePath = @"C:\Users\JohnDoe\Documents\example.png";
NameValueCollection values = new NameValueCollection();
values.Add("fileName", Path.GetFileName(filePath));
byte[] response = new WebClient().UploadFile(url, filePath);
在此示例中,我们定义了 url
和 filePath
两个参数,分别代表请求 URL 和文件路径。然后我们创建了一个 NameValueCollection
对象来存储文件名参数,使用 WebClient.UploadFile
方法上传文件,并获取服务器响应。
无论是使用 HttpWebRequest
还是 WebClient
,在发送带有文件的 HTTP POST 请求时,我们都需要注意请求内容类型和请求长度的设置,以及文件数据的写入方式。同时需要在请求结束时关闭相关流。