Xamarin.Android: HttpClient с MultipartFormDataContent возвращает 400 неверных запросов - PullRequest
0 голосов
/ 26 июня 2018

Я разрабатываю приложение Xamarin.Android , и мне нужно обновить записанный аудиофайл.

Для этого мой клиент предоставил мне такой API-интерфейс:

  • URL: / api / recordings /
  • Метод: POST
  • Формат данных: multipart / form-data
  • Поля: некоторые текстовые поля и аудиофайл дляотправить

Когда я проверяю его на Почтальон , он работает нормально .Фрагменты кода генерации:

POST /api/recordings/ HTTP/1.1
Host: X.X.X.X
Cache-Control: no-cache
Postman-Token: xxxxx-xxxx-xxxx-xxxx-xxxxx
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="param1" 
param1 name

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="param2"
param2 name

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="audio_file"; filename="xxx.wav"
Content-Type: audio/wav

Но когда я пытаюсь из приложения , я получаю 400 - Ошибка неверного запроса .

Первая попытка:

Сначала я попробовал следующий базовый код:

using (HttpClient client = new HttpClient())
{       
    try
    {
        MultipartFormDataContent formData = new MultipartFormDataContent();
        formData.Add(new StringContent("param1 name"), "param1");
        formData.Add(new StringContent("param2 name"), "param2");
        var response = await client.PostAsync(url, formData);
        Logger.Log("Response : " + responseObj.ToString());
    }
    catch (Exception ex)
    {
        Logger.Log("Exception : " + ex.ToString());
    }
}

Но есть 400 - Ошибка неверного запроса :

Response : StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Server: nginx/1.15.0
  Date: Mon, 25 Jun 2018 23:25:41 GMT
  Connection: keep-alive
  Vary: Cookie
  X-Frame-Options: SAMEORIGIN
  Content-Type: application/json
  Content-Length: 85
  Allow: POST, OPTIONS
}

Вторая попытка:

Затем я попробовал следующий фрагмент, который нашел там :

string servResp = "";
string boundary = "----CustomBoundary" + DateTime.Now.Ticks.ToString("x");
using (var content = new MultipartFormDataContent(boundary))
{
    content.Headers.Remove("Content-Type");
    content.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary);
    content.Add(new StringContent("param1 name"), "param1");
    content.Add(new StringContent("param2 name"), "param2");

    HttpClientHandler handler = new HttpClientHandler();
    var cookieContainer = new CookieContainer();
    handler.CookieContainer = cookieContainer;

    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);
    request.Headers.ExpectContinue = false;
    request.Content = content;
    try
    {
        var httpClient = new HttpClient(handler);
        HttpResponseMessage response = await httpClient.SendAsync(request);
        response.EnsureSuccessStatusCode();
        servResp = await response.Content.ReadAsStringAsync();
    }
    catch (Exception ex)
    {
        Logger.Log("PostTest() - Exception : " + ex.ToString());
    }
}
return servResp;

Но все еще существует 400 - Ошибка неверного запроса :

Exception : System.Net.Http.HttpRequestException: 400 (Bad Request)
  at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode () [0x0002a] in <996a681f30a44cd685a4da54e11956e2>:0 

=> У вас есть какое-либо объяснение?Как я могу это исправить?

Редактировать: аудиофайл

Я не указал код аудиофайла, я используюByteArrayContent в обоих случаях:

byte[] b = System.IO.File.ReadAllBytes(fullFilePath);
formData.Add(new ByteArrayContent(b, 0, b.Length), "audio_file", "audio.wav");

Вывод:

Мне удалось решить мою проблему, создав консольный проект, использующий один и тот же сервис: это позволяет мненайдите и исправьте мою ошибку.

Что касается другой проблемы, я следовал инструкциям Fiddler для настройки прокси на устройстве.Однако, похоже, что прокси не работает для приложений, но только для веб-сайтов в последних версиях Android ...

Знаете ли вы альтернативу Fiddler, которая может работать на Androidустройства?

...