Как использовать Web Api в приложении xamarin CrossPlatform

Я создал веб-api, который извлекает данные из базы данных SQL. Мне нужно потреблять web api в xamrin для android и xamarin для iOS. На данный момент xamarin для android. Я не уверен, как вызвать метод GET и Post на основе события нажатия кнопки.

Вот веб-апи

using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; namespace MvcAppDept.Controllers { public class DeptController : ApiController { // GET api/values public IEnumerable<Dept> Get() { AndroidAppDBEntities db = new AndroidAppDBEntities(); var data = from dept in db.Depts orderby dept.no select dept; return data.ToList(); } // GET api/values/5 public Dept Get(int id) { AndroidAppDBEntities db = new AndroidAppDBEntities(); var data = from dept in db.Depts where dept.no == id select dept; return data.SingleOrDefault(); } // POST api/values public void Post(Dept obj) { AndroidAppDBEntities db = new AndroidAppDBEntities(); db.Depts.Add(obj); db.SaveChanges(); } // PUT api/values/5 public void Put(int id,Dept obj) { AndroidAppDBEntities db = new AndroidAppDBEntities(); var data = from dept in db.Depts where dept.no == id select dept; Dept old = data.SingleOrDefault(); old.no = obj.no; old.name = obj.name; db.SaveChanges(); } // DELETE api/values/5 public void Delete(int id) { AndroidAppDBEntities db = new AndroidAppDBEntities(); var data = from dept in db.Depts where dept.no == id select dept; Dept obj = data.SingleOrDefault(); db.Depts.Remove(obj); db.SaveChanges(); } } } Global.asax.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Http; using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; namespace MvcAppDept { public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); } } 

}

MainActivity.cs

 using System; using System.Net.Http; using System.Threading.Tasks; using Android.App; using Android.Content; using Android.Runtime; using Android.Views; using Android.Widget; using Android.OS; namespace DeptAndroidApp { [Activity(Label = "DeptAndroidApp", MainLauncher = true, Icon = "@drawable/icon")] public class MainActivity : Activity { protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); SetContentView(Resource.Layout.Main); Button GetButton = FindViewById<Button>(Resource.Id.GetButton); var txtValue1 = FindViewById<EditText>(Resource.Id.txtValue1); int id = Convert.ToInt32(txtValue1.Text); var No = FindViewById<TextView>(Resource.Id.No); var Name = FindViewById<TextView>(Resource.Id.Name); //GetButton.Click += GetDept(id); GetButton.Click+=async(sender,args)=>{ //error Cannot await 'DeptAndroidApp.dept Dept dept=await GetDept(id); No.Text=dept.No; Name.Text=dept.name} } //Error The return type ofasync method must be void,task orTask<T> public async Dept GetDept(int id) { using (var client = new HttpClient()) { client.BaseAddress = new Uri("http://****.***/"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); var result= await client.GetAsync(string.Format("/api/dept/{0}",id)); return JsonConvert.DeserializeObject<Dept>(await result.Content.ReadAsStringAsync()); } } } } 

Вот как я буду использовать эту услугу практически из любого проекта (включая проекты Xamarin).

Во-первых, избавьтесь от строки в файле Global.asax, который говорит следующее:

 GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); 

Вообще говоря, это плохая практика. Вы хотите иметь, по крайней мере, форматы XML и JSON, потому что в спокойной среде потребители могут определить, какой тип сериализации им нужен / нужен.

Затем я буду использовать класс System.Net.Http.HttpClient для взаимодействия с этой службой.

Взаимодействие с сервисом Web Api с этого момента довольно просто. Вот несколько примеров.

 public async List<Dept> GetDepts() { using(var client = new HttpClient()) { client.BaseAddress = new Uri("http://<ipAddress:port>/"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); return await client.GetAsync("/api/dept"); } } public async Task<Dept> GetDept(int id) { using(var client = new HttpClient()) { client.BaseAddress = new Uri("http://<ipAddress:port>/"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var result = await client.GetAsync(string.format("/api/dept/{0}", id)); return JsonConvert.DeserializeObject<Dept>(await result.Content.ReadAsStringAsync()); } } public async Task AddDept(Dept dept) { using(var client = new HttpClient()) { client.BaseAddress = new Uri("http://<ipAddress:port>/"); await client.PostAsJsonAsync("/api/dept", dept); } } public async Task UpdateDept(Dept dept) { using(var client = new HttpClient()) { client.BaseAddress = new Uri("http://<ipAddress:port>/"); await client.PutAsJsonAsync(string.format("/api/dept/{0}", dept.no), dept); } } public async Task DeleteDept(int id) { using(var client = new HttpClient()) { client.BaseAddress = new Uri("http://<ipAddress:port>/"); client.DeleteAsync(string.format("/api/dept/{0}", id)); } } 

В любом случае, вы должны начать работать в правильном направлении. Это определенно может быть очищено, и я написал это бесплатно, поэтому могут быть некоторые опечатки.

Обновить

Обновите свой MainActivity.cs

Вместо int id = Convert.ToInt32(txtValue1)

использование

 int id = Convert.ToInt32(txtValue1.Text); 

Вместо GetButton.Click += GetDept(id);

использование

 GetButton.Click += async (sender, args) => { var dept = await GetDept(id); No.Text = dept.no; Name.Text = dept.name } 
Intereting Posts
Отслеживать скорость движущегося вида Как мне обрабатывать нажатие кнопки «Назад» в приложении для Android (Delphi)? Android-андроид 2.2 сжимает все файлы в встроенном apk Не удается запустить тестовый пример JUnit 4 в проекте Eclipse Android Могу ли я создавать приложения для Android с учетом родных? Продолжайте получать эту ошибку, когда я пытаюсь скомпилировать Gradle в Android Studio на UBUNTU 14.04 События Google Awareness Api, пока приложение не запущено Панель инструментов не видна в макете Изменение цвета метки метки предпочтений Android proguard error com.google.ads.util.i: и setMediaPlaybackRequiresUserGesture (boolean) ANDROID: загрузка асинхронных изображений в listView Можно ли получить координаты в реальном времени ImageView, когда он находится в анимации трансляции? Полноэкранный режим DialogFragment показывает отступ по бокам Намерение для страницы сведений о приложении Как программно завершить приложение Android NDK (native activity)?