#api #xamarin #xamarin.forms #httpclient
#API #xamarin #xamarin.forms #httpclient
Вопрос:
Мне нужно заполнить форму входными данными в Xamarin и отправить их на мою страницу API.
Я уже пробовал отправлять данные в «Postman», и он сохранил их правильно, но я хотел бы знать, как отправить их из Xamarin.
Внимание, я могу правильно считывать данные из приложения.
public class FuelPurchase
{
public int id { get; set; }
public string date{ get; set; }
public int vueltametal { get; set; }
public int amount{ get; set; }
public string station{ get; set; }
public string location{ get; set; }
}
И форма, которую вы создаете в Xamarin, такова.
<Label Text="Fuel Purchase"/>
<Label Text="Fecha">
<DatePicker x:Name="Date"/>
<Label Text="Station"/>
<Entry x:Name="Station"/>
<Label Text="Location"/>
<Entry x:Name="Location"/>
<Label Text="Amount"/>
<Entry x:Name="amount" Keyboard="Numeric"/>
Комментарии:
1. Postman включает в себя генераторы кода, которые помогут вам начать: Через пользовательский интерфейс: learning.postman.com/docs/sending-requests/… Через SDK: learning.postman.com/docs/developer/code-generators
Ответ №1:
Вот статический класс, который я использую для API. Вы можете изменить URL, чтобы он соответствовал вашему, если у вас есть только один. Обязательно просмотрите его и убедитесь, что все ваши «/» находятся в нужном месте!
using Newtonsoft.Json;
using System;
using System.Diagnostics;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using NGJS = System.Text.Json;
using System.Threading.Tasks;
namespace TestBCS
{
public class RestService
{
readonly HttpClient client;
public RestService()
{
client = new HttpClient(new HttpClientHandler
{
Proxy = null,
UseProxy = false
});
}
#region GET
public async Task<object> RefreshDataAsync(string url, string qs)
{
Uri uri = new Uri(string.Format(url, qs));
HttpResponseMessage response = await client.GetAsync(uri);
if (response.IsSuccessStatusCode)
{
using (var stream = await response.Content.ReadAsStreamAsync())
{
return await NGJS.JsonSerializer.DeserializeAsync<object>(stream);
}
}
//Error Handling here
return null;
}
#endregion
#region POST
static void SerializeJsonIntoStream(object value, Stream stream)
{
using (var sw = new StreamWriter(stream, new UTF8Encoding(false), 1024, true))
using (var jtw = new JsonTextWriter(sw) { Formatting = Formatting.None })
{
var js = new JsonSerializer();
js.Serialize(jtw, value);
jtw.Flush();
}
}
HttpContent CreateHttpContent(object content)
{
HttpContent httpContent = null;
if (content != null)
{
var ms = new MemoryStream();
SerializeJsonIntoStream(content, ms);
ms.Seek(0, SeekOrigin.Begin);
httpContent = new StreamContent(ms);
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
}
return httpContent;
}
public async Task PostStreamAsync(string url, object content)
{
string Url = url;
using (var client = new HttpClient())
using (var request = new HttpRequestMessage(HttpMethod.Post, Url))
using (var httpContent = CreateHttpContent(content))
{
request.Content = httpContent;
using (var response = await client
.SendAsync(request, HttpCompletionOption.ResponseHeadersRead)
.ConfigureAwait(false))
{
response.EnsureSuccessStatusCode();
Debug.WriteLine("Successfully Sent");
}
}
}
#endregion
}
}
Комментарии:
1. Вы увидите кучу красных строк в Visual Studio, если у вас не загружены пакеты nuget, которые ему нужны, но не волнуйтесь. Вы просто загружаете их с помощью nuget PM, и все будет хорошо. Также проверьте свои разрешения для Интернета и прочего. Оно должно быть включено, но просто чтобы убедиться, поставьте ему чек.
2. Я не уверен, почему я удаляю HttpClient в POST, а не GET … LOL
3. Большое вам спасибо, но как мне сохранить записи как объекты моего класса?
4. Вы создаете новый экземпляр объекта = `FuelPurchase fp = new FuelPurchase() { fp. Дата = Date.Date, fp.Amount = сумма. Текст и т.д…. } Затем отправьте объект в методе Post = RestService. PostStreamAsync (ваш URL здесь, fp)
5. Просто чтобы уточнить, это отправляет его только на вашу конечную точку, оно ничего не сохраняет на устройстве, только где-то на вашем сервере.