繁体   English   中英

如何在 C# 中使用 HttpClient 发送 json 文件?

[英]How to send a json file with HttpClient in C#?

我正在尝试用邮递员发送一个 JSON 文件并且它正在工作。 但是当我尝试通过HttpClient发送相同的内容时,它不起作用。

System.IO.File.WriteAllText(dirName + "\\importproduct.json", jsonitems);
var fileByteArray = File.ReadAllBytes(dirName + "\\importproduct.json");

using (var _client = new HttpClient())
{
    using (var content = new MultipartFormDataContent())
    {
        content.Add(new StreamContent(new MemoryStream(fileByteArray)), "file");
        var url = $"{firmInfo.ServiceUrl}/product/api/products/import";
        _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearer_token.id_token);

        var response = _client.PostAsJsonAsync(url, content).Result;
        var result = response.Content.ReadAsStringAsync().Result;
    }
}

邮差: 在此处输入图片说明

而不是使用 PostAsJsonAsync(); 你应该使用 PostAsync() 的方法; 所以你的代码应该看起来像这样

using (var _client = new HttpClient())
{
    using (var content = new MultipartFormDataContent())
    {
        content.Add(new StreamContent(new MemoryStream(fileByteArray)), "file");
        var url = $"{firmInfo.ServiceUrl}/product/api/products/import";
        _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearer_token.id_token);

        var response = _client.PostAsync(url, content).Result;
        var result = response.Content.ReadAsStringAsync().Result;
    }
}

PostAsJsonAsync方法是一种通用方法,它期望将序列化并在 POST 正文中发送的对象作为第二个参数。

var obj = JsonConvert.DeserializeObject<SomeModelClass>(jsonString);
var response = await _client.PostAsJsonAsync(url, obj).Result;

这是基于efecetir上面帖子。 这个对我有用。 顺便说一句,我也赞成他的帖子。 我的问题是我需要在基于内容的级别设置内容类型。

var fileByteArray = File.ReadAllBytes(filePath);

HttpContent bytesContent = new ByteArrayContent(fileByteArray);
using (var httpClient = new HttpClient())
using (var formData = new MultipartFormDataContent())
{
    var RequestUri = new Uri($"http://whatever.com/");
    //client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearer_token.id_token);

    formData.Headers.Add("super-secret-key", "blah");
    bytesContent.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json");
    
    //httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); //("multipart/form-data")); // Not needed
    formData.Add(bytesContent, "file", "blah.json");
    var response = httpClient.PostAsync(RequestUri, formData).Result;
    return await HandleResponse(response);
}

感谢您的意见。 我修复了它并将我的代码转换如下。 现在它正在工作并且更加干净。

HttpContent bytesContent = new ByteArrayContent(fileByteArray);
        using (var client = new HttpClient())
        using (var formData = new MultipartFormDataContent())
        {
            var url = $"{firmInfo.ServiceUrl}/product/api/products/import";
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearer_token.id_token);

            formData.Add(bytesContent, "file", "importproduct.json");
            var response = client.PostAsync(url, formData).Result;
            var result = response.Content.ReadAsStringAsync().Result;

        }

这是我用来发布表单信息和文件的代码

using (var httpClient = new HttpClient())
{

    var surveyBytes = ConvertToByteArray(surveyResponse);


    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    var byteArrayContent =   new ByteArrayContent(surveyBytes);

    byteArrayContent.Headers.ContentType = MediaTypeHeaderValue.Parse("text/csv");
       var url = $"{firmInfo.ServiceUrl}/product/api/products/import";
    var response = await httpClient.PostAsync(url , new MultipartFormDataContent
    {  
        {byteArrayContent, "\"file\"", dirName + "\\importproduct.json"}
    });

    return response;
}

这适用于 .net 4.5。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM