Я разрабатываю приложение 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устройства?