再说HttpClient类(3)

107 阅读2分钟

当然,这里提供一个示例,展示如何为添加到 MultipartFormDataContentStreamContentByteArrayContent 设置 Content-DispositionContent-Type 头部。

示例代码

using System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // 创建HttpClient实例
        using (var httpClient = new HttpClient())
        {
            // 创建MultipartFormDataContent实例
            using (var multipartContent = new MultipartFormDataContent())
            {
                // 添加文本内容
                var stringContent = new StringContent("这是一个文本字段");
                stringContent.Headers.ContentType = new MediaTypeHeaderValue("text/plain");
                multipartContent.Add(stringContent, "textFieldName");

                // 添加文件流
                var fileStream = new FileStream("path/to/your/file.txt", FileMode.Open);
                var streamContent = new StreamContent(fileStream);
                streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
                streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
                {
                    Name = "fileFieldName",
                    FileName = "file.txt"
                };
                multipartContent.Add(streamContent, "fileFieldName", "file.txt");

                // 添加字节数组内容
                byte[] byteArray = System.Text.Encoding.UTF8.GetBytes("这是一个字节数组字段");
                var byteArrayContent = new ByteArrayContent(byteArray);
                byteArrayContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
                byteArrayContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
                {
                    Name = "byteArrayFieldName"
                };
                multipartContent.Add(byteArrayContent);

                try
                {
                    // 发送POST请求
                    var response = await httpClient.PostAsync("http://example.com/api", multipartContent);
                    response.EnsureSuccessStatusCode();
                    string responseBody = await response.Content.ReadAsStringAsync();
                    Console.WriteLine(responseBody);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }
    }
}

代码解释

  1. 创建 HttpClient 实例

    using (var httpClient = new HttpClient())
    
  2. 创建 MultipartFormDataContent 实例

    using (var multipartContent = new MultipartFormDataContent())
    
  3. 添加文本内容

    • 创建 StringContent 实例并设置其 ContentTypetext/plain
    • 使用 multipartContent.Add 方法添加文本内容。
    var stringContent = new StringContent("这是一个文本字段");
    stringContent.Headers.ContentType = new MediaTypeHeaderValue("text/plain");
    multipartContent.Add(stringContent, "textFieldName");
    
  4. 添加文件流

    • 创建 FileStream 实例并初始化 StreamContent
    • 设置 StreamContentContentTypeapplication/octet-stream
    • 设置 Content-Disposition 头部,指定字段名和文件名。
    • 使用 multipartContent.Add 方法添加文件流。
    var fileStream = new FileStream("path/to/your/file.txt", FileMode.Open);
    var streamContent = new StreamContent(fileStream);
    streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
    streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
    {
        Name = "fileFieldName",
        FileName = "file.txt"
    };
    multipartContent.Add(streamContent, "fileFieldName", "file.txt");
    
  5. 添加字节数组内容

    • 创建 ByteArrayContent 实例并初始化为字节数组。
    • 设置 ByteArrayContentContentTypeapplication/octet-stream
    • 设置 Content-Disposition 头部,指定字段名。
    • 使用 multipartContent.Add 方法添加字节数组内容。
    byte[] byteArray = System.Text.Encoding.UTF8.GetBytes("这是一个字节数组字段");
    var byteArrayContent = new ByteArrayContent(byteArray);
    byteArrayContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
    byteArrayContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
    {
        Name = "byteArrayFieldName"
    };
    multipartContent.Add(byteArrayContent);
    
  6. 发送 POST 请求

    • 使用 httpClient.PostAsync 方法发送请求并处理响应。
    var response = await httpClient.PostAsync("http://example.com/api", multipartContent);
    response.EnsureSuccessStatusCode();
    string responseBody = await response.Content.ReadAsStringAsync();
    Console.WriteLine(responseBody);
    

注意事项

  • 文件流处理:确保在发送请求后关闭文件流,这里使用了 using 语句自动关闭。
  • 异常处理:使用 try-catch 块来捕获并处理可能的异常。
  • 响应处理:确保响应成功状态后再读取响应内容。

通过这种方式,你可以为不同的内容部分设置不同的 Content-TypeContent-Disposition,使得服务器能够正确地解析和处理请求体中的数据。