В прошлой теме мы рассмотрели, как отправлять запрос к внешнему серверу. Теперь рассмотрим, как мы можем отправлять запросы самых различных типов - GET, POST, PUT, DELETE. Для тестирования взаимодействия с сервером приложения на Xamarin создадим веб-сервис (либо можно взять уже имеющийся сервер вне зависимсти от технологии бекэнда). В качестве основы для веб-сервиса выберем технологию ASP.NET Core. Для этого создадим новый проект по типу ASP.NET Core Web Application
Назовем SocialService:
Далее в открывшемся окне в качеcтве шаблона проекта выберем ASP.NET Core Empty.
После создания проекта добавим в него через Nuget пакет Microsoft.EntityFrameworkCore.SqlServer
Затем добавим в проект новую папку Models. А в папку Models - новый класс, который будет представлять модель используемых данных - класс Friend:
using System.ComponentModel.DataAnnotations; namespace SocialService.Models { public class Friend { public int Id { get; set; } [Required] public string Name { get; set; } public string Email { get; set; } public string Phone { get; set; } } }
Затем добавим в папку Models класс ApplicationContext - класс контекста данных, через который будем подключаться к базе данных:
using Microsoft.EntityFrameworkCore; namespace SocialService.Models { public class ApplicationContext : DbContext { public DbSet<Friend> Friends { get; set; } public ApplicationContext(DbContextOptions<ApplicationContext> options) : base(options) { Database.EnsureCreated(); } } }
Далее добавим в проект новую папку, которую назовем Controllers. Затем в эту папку добавим новый элемент по типу API Controller - Empty, который назовем FriendsController:
Изменим код этого контроллера на следующий:
using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using SocialService.Models; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace SocialService.Controllers { [Route("api/[controller]")] [ApiController] public class FriendsController : ControllerBase { ApplicationContext db; public FriendsController(ApplicationContext context) { db = context; } [HttpGet] public async Task<ActionResult<IEnumerable<Friend>>> Get() { return await db.Friends.ToListAsync(); } // GET api/Friends/5 [HttpGet("{id}")] public async Task<ActionResult<Friend>> Get(int id) { Friend Friend = await db.Friends.FirstOrDefaultAsync(x => x.Id == id); if (Friend == null) return NotFound(); return new ObjectResult(Friend); } // POST api/Friends [HttpPost] public async Task<ActionResult<Friend>> Post(Friend Friend) { if (Friend == null) { return BadRequest(); } db.Friends.Add(Friend); await db.SaveChangesAsync(); return Ok(Friend); } // PUT api/Friends/ [HttpPut] public async Task<ActionResult<Friend>> Put(Friend Friend) { if (Friend == null) { return BadRequest(); } if (!db.Friends.Any(x => x.Id == Friend.Id)) { return NotFound(); } db.Update(Friend); await db.SaveChangesAsync(); return Ok(Friend); } // DELETE api/Friends/5 [HttpDelete("{id}")] public async Task<ActionResult<Friend>> Delete(int id) { Friend Friend = db.Friends.FirstOrDefault(x => x.Id == id); if (Friend == null) { return NotFound(); } db.Friends.Remove(Friend); await db.SaveChangesAsync(); return Ok(Friend); } } }
В итоге получится следующий проект:
И изменим класс Startup, который имеется в проекте по умолчанию, следующим образом:
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using SocialService.Models; namespace SocialService { public class Startup { public void ConfigureServices(IServiceCollection services) { string con = "Server=(localdb)\\mssqllocaldb;Database=friendsdb1;Trusted_Connection=True;"; // устанавливаем контекст данных services.AddDbContext<ApplicationContext>(options => options.UseSqlServer(con)); services.AddControllers(); // используем контроллеры без представлений } public void Configure(IApplicationBuilder app) { app.UseDeveloperExceptionPage(); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); // подключаем маршрутизацию на контроллеры }); } } }
Это типовой веб-сервис, реализующий стандартный CRUD-интерфейс, достаточный для демонстрации сетевых возможностей приложения на Xamarin. Но естественно конкретные сервисы, с которыми придется взаимодействовать, могут отличаться по функционалу.
После того, как сервис готов, его можно запустить с помощю одного из способов, описанных на странице http://metanit.com/sharp/mvc5/24.3.php.