Как отправить файл json с помощью HttpClient в C#? - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь отправить файл 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;
    }
}

PostMan: enter image description here

Ответы [ 4 ]

2 голосов
/ 27 марта 2020

Вместо использования PostAsJsonAsyn c (); метод, который вы должны использовать PostAsyn c (); Так что ваш код должен выглядеть примерно так

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;
    }
}
1 голос
/ 27 марта 2020

PostAsJsonAsync метод является обобщенным c методом, он ожидает в качестве второго параметра объект, который будет сериализован и отправлен в теле POST.

var obj = JsonConvert.DeserializeObject<SomeModelClass>(jsonString);
var response = await _client.PostAsJsonAsync(url, obj).Result;
0 голосов
/ 27 марта 2020

Вот код, который я использую для публикации информации о форме и файла

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.

0 голосов
/ 27 марта 2020

Спасибо за ваши комментарии. Я исправил это и преобразовал мои коды как ниже. Теперь он работает и намного более чистый.

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;

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...