简体   繁体   English

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

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

I'm trying send a JSON file with postman and it's working.我正在尝试用邮递员发送一个 JSON 文件并且它正在工作。 But when I'm trying to send the same contents via HttpClient it's not working.但是当我尝试通过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;
    }
}

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

Instead of using PostAsJsonAsync();而不是使用 PostAsJsonAsync(); method you should use PostAsync();你应该使用 PostAsync() 的方法; So your code should be looking something like that所以你的代码应该看起来像这样

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 method is a generic method, it expects as the second parameter the object that will be serialized and sent in the POST body. PostAsJsonAsync方法是一种通用方法,它期望将序列化并在 POST 正文中发送的对象作为第二个参数。

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

This is based on efecetir's post above.这是基于efecetir上面帖子。 It works for me.这个对我有用。 BTW, I also upvoted his post.顺便说一句,我也赞成他的帖子。 My issue was I needed to set the content type at the content-based level.我的问题是我需要在基于内容的级别设置内容类型。

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);
}

Thanks for your comments.感谢您的意见。 I fixed it and convert my codes as below.我修复了它并将我的代码转换如下。 Now it's working and much more clean.现在它正在工作并且更加干净。

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;

        }

Here's code I'm using to post form information and a file这是我用来发布表单信息和文件的代码

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;
}

This is for .net 4.5.这适用于 .net 4.5。

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

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