Eliza Maria Ответов: 1

Как отправить json и данные формы через один и тот же api в xamarin?


Привет!У меня есть метод API,который должен отправлять на сервер как json, так и формат данных формы, но я не понимаю, как я могу этого добиться.В настоящее время у меня есть этот метод, который возвращает 415 неподдерживаемых типов носителей:
public async Task<JObject> AddUser(User user, MediaFile file)
      {
          string userRegisterUrl = "http://10.0.2.2:53547/api/PostUser";
          HttpContent fileStreamContent = new StreamContent(file.GetStream());
          var json = JsonConvert.SerializeObject(user);
          HttpClientHandler clientHandler = new HttpClientHandler();
          clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };
          try
          {
              using (var formData = new MultipartFormDataContent())
              {
                  formData.Add(fileStreamContent, Guid.NewGuid().ToString() + "jpg");
                  formData.Add(new StringContent(json.ToString()));
                  using(HttpClient client = new HttpClient(clientHandler))
                  {
                      var responce = await client.PostAsync(userRegisterUrl, formData);
                      string contents = await responce.Content.ReadAsStringAsync();
                      return (JObject.Parse(contents));
                  }
              }
          }catch(Exception ex)

          {
              throw ex;
          }
      }



Как я могу добиться этого, чтобы передаваемые данные не были затронуты?

Что я уже пробовал:

public async Task AddUser(User user,MediaFile file)
          {
            string userRegisterUrl = "http://10.0.2.2:53547/api/PostUser";
              HttpClientHandler clientHandler = new HttpClientHandler();
              clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };
  var json = JsonConvert.SerializeObject(user);
              StringContent content = new StringContent(json);
    HttpContent fileStreamContent = new StreamContent(file.GetStream());
    using (var httpClient = new HttpClient(clientHandler))
              {

                  using (var formData = new MultipartFormDataContent())
                  {

                      httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("multipart/form-data"));
                      formData.Add(fileStreamContent);
                      formData.Add(content);
                      var responses = await httpClient.PostAsync(userRegisterUrl, formData);
                      if (responses.IsSuccessStatusCode)
                      {
                          //var result = response.Content.ReadAsStringAsync().Result;

                      }
                  }
              }


          }

Richard MacCutchan

Вам нужно посмотреть на код API, чтобы увидеть, в каком формате должны быть данные.

Eliza Maria

Спасибо за ваш ответ.Я на самом деле не понимаю, что вы хотите этим сказать, поскольку у меня есть изображение, которое является данными формы, и сведения о пользователе, которые являются форматом json.Я не могу передать изображение на сервер в виде json, поскольку оно получено сервером в виде IFormFile и загружено в папку.

1 Ответов

Рейтинг:
5

Sandeep Mewara

Веб-API встроенные средства форматирования поддерживают только следующие типы носителей: application/json, text/json, application/xml, text/xml и application/x-www-form-urlencoded

Быстрый взгляд на то, что означает ошибка:

Цитата:
Код ответа клиента на ошибку HTTP 415 Unsupported Media Type указывает, что сервер отказывается принять запрос, поскольку формат полезной нагрузки находится в неподдерживаемом формате.

Проблема с форматом может быть вызвана указанным в запросе типом контента или кодировкой контента, а также в результате непосредственной проверки данных.

Ссылка: 415 неподдерживаемый тип носителя - HTTP | MDN[^]

Теперь, в вашем контексте, вы пытаетесь сделать:
API method that has to send both json and form-data format to the server

Это средство:
1. Вы должны убедиться, что сервер принимает несколько форматов в качестве полезной нагрузки типа контента.
2. Как только вы в этом убедитесь, то для multipart/form-data, который является тем, что вы посылаете, посмотрите на Веб-API ASP.NET : MultipartDataMediaFormatter[^]

Попробуйте.


Eliza Maria

Спасибо,именно это я и хотел узнать :D

Sandeep Mewara

:большой палец вверх: