Introdução

Nest blog post você irá aprender como criar e consumir um RESTful Web Service usando o framework ASP.NET e linguagem C#.

Instalação

Primeiramente, você deve baixar as ferramentas necessárias para desenvolvimento.

Caso você seja um usuário Windows, pode baixar uma versão do Visual Studio. Dentre as distribuições, o Visual Studio Comunnity é de graça e serve todos os propósitos para este exemplo. Você pode baixar ele aqui.

Caso você seja um usuário Mac ou de alguma distribuição Linux, pode utilizar o MonoDevelop. Este encontra-se aqui.

Criando um projeto

Vamos seguir os passos com o Visual Studio, mas os conceitos e os passos podem ser aplicados da mesma forma para o MonoDevelop.

Uma vez que tenha instalado, você verá a página incial. VS Studio

Agora, vá em File>New>Project.. ou aperte Ctrl+Shift+N VS Studio

A tela de criação de um projeto será aberta e você terá várias opções de projeto para selecionar. Vá em Templates>Visual C#>Web e escolha a opção ASP.NET Web Application. VS Studio

Após isso escolha a opção Web API já que queremos desenvolver um serviço REST. Como boa prática selecione a opção “Add unit tests” para incluir um projeto de testes unitários, dessa forma você pode desenvolver testes automáticos para sua aplicação. VS Studio

Depois de finalizado você terá uma tela parecida com esta. VS Studio

Podemos notar que o template segue o padrão de MVC. Dessa forma o pacote Model contem as classes que representam os modelos, o pacote controller contem as classes que mediam a entrada, convertendo-a em comandos para o modelo ou para a view, o pacote view apresenta os dados.

Aplicação

Para este exemplo vamos escrever a boa e velha calculadora :D. Mas para deixarmos as coisas um pouco mais interessantes vamos usar Padrões de Projeto.

Para isto, ao invés de criarmos uma única classe Calculator que possua 4 métodos para as operações básicas(soma, subtração, multipicação e divisão) vamos usar um Padrão de Estratégia.

Primeiramente, crie a interface da calculadora que provê um método que representa uma operação.

public interface ICalculate 
{  
    int Calculate(int value1, int value2);
}

Adicione uma classe Plus que implementa esta interface e faz a operação ser uma soma.

public class Plus : ICalculate 
{
    public int Calculate(int value1, int value2) 
    {
        return value1 + value2;
    }
}

Adicione uma classe Plus que implementa esta interface e faz a operação ser uma subtração.

public class Minus : ICalculate 
{
    public int Calculate(int value1, int value2) 
    {
        return value1 - value2;
    }
}

Por fim, adicione uma classe Calculator que contem um atributo e um método calculate que irá fazer um binding em tempo de execução para o método da classe(Plus ou Minus) que for passada no construtor quando esta classe for criada.

public class Calculator
{
    private ICalculate calculateStrategy;

    public Calculator(ICalculate strategy) 
    {
    	calculateStrategy = strategy;
    }

    public int Calculate(int value1, int value2) 
    {
    	return calculateStrategy.Calculate(value1, value2);
    }
}

Web Service

Na pasta Controllers clique com o botão diretiro e selecione add controler e escolha a opção Web API Controller - Empty. Nomeie esta classe como CalculatorController. Esta classe ira definir o recurso a ser utilizado e a lógica que será implementada.

using CalculatorExample.Business;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace CalculatorExample.Controllers
{
    public class CalculatorController : ApiController
    {
        [Route("api/calculator/sum")]
        [HttpGet]
        public int Sum([FromUri]int value1, [FromUri]int value2)
        {
            Calculator calculator = new Calculator(new Plus());

            return calculator.Calculate(value1, value2);
        }

        [Route("api/calculator/minus")]
        [HttpGet]
        public int Minus([FromUri]int value1, [FromUri]int value2)
        {
            Calculator calculator = new Calculator(new Minus());

            return calculator.Calculate(value1, value2);
        }
    }
}

A anotação [Route] especifíca a rota para chegar a este recurso. [HttpGet] especifíca o mêtodo a ser usado, neste caso GET, [FromUri] faz um parse das variáveis que são passadas na url, neste caso value1 e value2.

Assim, poderiamos acessar estes métodos como feito nas imagens a seguir:

Soma Sum

Subtração Minus

Cliente

Para nosso cliente, vamos alterar o arquivo Index.cshtml localizado na pasta Views/Home. Para este exemplo, podemos utilizar dois campos de texto e dois botões(um de soma e outro de subtração) e um campo para o resultado. Quando um dos botões é clicado a chamada é feita ao serviço e o resultado é mostrado.

<div id="body" class="jumbotron">
    <input type="text" id="value1">
    <input type="text" id="value2">
    <button onclick="Sum()">Soma</button>
    <button onclick="Minus()">Subtrai</button>
    <br />
    Resultado: <label id="result"></label>
</div>

@section scripts{
    <script type="text/javascript">
        function Sum() {
            $.getJSON("/api/calculator/sum/?value1=" + $('#value1').val() +
                "&value2=" + $('#value2').val(), function (data)
            {
                $(data).each(function(i, item)
                {
                    $('#result').text(item);
                });
            });
        }
        
        function Minus() {
            $.getJSON("/api/calculator/minus/?value1=" + $('#value1').val() +
                "&value2=" + $('#value2').val(), function (data) {
                    $(data).each(function (i, item) {
                        $('#result').text(item);
                    });
                });
        }
    </script>
}

Caso tenha seguido todos os passo a passo você terá como resultado final algo como App

Dê uma olhada no repositório para uma versão deste exemplo.