Quando eu comecei a trabalhar com Xamarin Forms uma das primeiras coisas que eu precisei fazer foi consumir serviços. Quando a gente usa o Xamarin Forms para consumir API RestFull é bem fácil. Mas, serviços ASMX você vai precisar implementar algumas coisas para as diferentes plataformas iOS e Android.
Primeiramente, eu criei um projeto cross-plataform Xamarin Forms portable no Visual Studio 2015. Para esse artigo eu não uso nenhuma biblioteca de terceiros para consumir os serviços. Eu gosto de criar as minhas próprias implementações para aprender.
Blz, vamos começar!
O que a gente precisa?
1 – Uma interface para o serviço que contenha todos os métodos que a gente precisa. Essa interface ficará no projeto portable.
2 – A referência ao serviço em si. Precisa ser referenciado em ambos os projetos Xamarin.iOS e Xamarin.Droid projects.
3 – Uma classe que implementa a interface criada anteriormente. Essa classe será um wrapper para o serviço ASMX. Precisam ser criadas duas classes em cada uma das plataformas both Xamarin.Droid e Xamarin.iOS. Então, sim, você precisará criar duas classes.
4 – Adiconar uma dependency injection para essa interface em ambos os projetos Xamarin.Droid e Xamarin.iOS projects.
5 – Uma propriedade estática no projeto portable para consumir o serviço. Essa propriedade será injetada pelo Xamarin Forms.
Blz, pare! Como essas coisas irão funcionar? Vamos ver a implementação no projeto Droid…
Vamos dizer que você tem uma view e você precisa exibir todos os clientes que são retornados através do serviço ASMX. No serviço tem um método que recebe como parâmetro um critério de filtro e retorna essa lista de clientes.
Primeiro, referencie o serviço ASMX no projeto Xamarin.Droid.
Segundo, criei a interface “ICustomerSoapService” e um método GetAllCustomers.
public interface ICustomer { string Name {get;set;} string Id {get;set;} } public interface ICustomerSoapService { Task<List<ICustomer>> GetAllCustomers(string criteria = null); }
Certo, agora crie uma classe “CustomerSoapService” no projeto Xamarin.Droid e implemente a interface “ICustomerSoapService”
[assembly: Dependency(typeof(FSL.XF2.Droid.CustomerSoapService))] namespace FSL.XF2.Droid { public sealed class CustomerSoapService : ICustomerSoapService { CustomersWs.Customers service; public CustomerSoapService() { service = new CustomersWs.Customers() { Url = "http://localhost/FSL.WS/Customers.asmx" }; } public async Task<List<ICustomer>> GetAllCustomers(string criteria = null) { return await Task.Run(() => { var result = service.GetAllCustomers(); return new List<ICustomer>(result); }); } } }
O código acima “CustomersWs” é a referência ao web service.
No projeto portable, cria a propriedade para ser injetada via dependency injection.
public partial class App : Application { private static ICustomerSoapService _customerSoapService; public static ICustomerSoapService CustomerSoapService { get { if (_customerSoapService== null) { _customerSoapService = DependencyService.Get<ICustomerSoapService>(); } return _customerSoapService; } } }
A propriedade acima usa o conceito de Lazy Loading, ou seja, o Xamarin Forms somente injetará a instancia da interface se a propriedade for usada.
Finalmente para chamar o método na view use da seguinte forma:
var customers = await App.CustomerSoapService.GetAllCustomers();
Download full source code:
FSL.ConsummingAsmxServicesInXamarinForms
Bom é isso. Esperto que tenha ajudado.
Abaixo encontrará alguns links úteis.
Consumindo Serviços ASMX com Xamarin Forms
ASMX : Perguntas, sugestões ou críticas são bem vindas. Boa sorte!
Faça download completo do código fonte no github. |