Я создал веб-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 }