Come lavorare con ActionResults nell'API Web

ASP.Net Web API è un framework leggero utilizzato per la creazione di servizi HTTP senza stato e RESTful. È possibile sfruttare i risultati dell'azione nell'API Web per restituire i dati dai metodi del controller dell'API Web.

Iniziare

Creiamo prima un progetto API Web. A tale scopo, creare un progetto ASP.Net vuoto in Visual Studio 2015 e selezionare la casella di controllo API Web quando si seleziona il modello di progetto. Quindi, salva il progetto con un nome.

Noterai che viene creato un progetto ASP.Net vuoto. Fare clic con il tasto destro sulla cartella della soluzione Controller e fare clic su Aggiungi -> Controller per creare un nuovo controller API Web. Selezionare "Web API 2 Controller - Empty" quando richiesto nella finestra che si apre successivamente. Salva il controller con un nome. Supponiamo che il nome del controller per questo esempio sia "DefaultController".

Creiamo una classe di entità denominata Contact.

public class Contact

    {

        public int Id { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

    }

Successivamente, aggiungi il seguente metodo a DefaultController.

public CustomActionResult Get()

        {

            Contact contact = new Contact();

            contact.Id = 1;

            contact.FirstName = "Joydip";

            contact.LastName = "Kanjilal";

            return new CustomActionResult(HttpStatusCode.OK, contact);

        }

Notare l'utilizzo della classe CustomActionResult durante la restituzione dei dati dal metodo del controller. Ora creiamo una classe CustomActionResult solo per assicurarci che il tuo codice venga compilato: implementeremo questa classe in seguito.

public class CustomActionResult : IHttpActionResult

    {

        public Task ExecuteAsync(CancellationToken cancellationToken)

        {

            throw new NotImplementedException();

        }

    }

Lavorare con ActionResults

Il controller dell'API Web può restituire uno qualsiasi dei seguenti tipi di valore:

  • HttpResponseMessage: in questo caso l'API Web convertirà il valore restituito in un oggetto messaggio di risposta Http e lo restituirà.
  • IHttpActionResult: in questo caso il runtime dell'API Web converte internamente il valore restituito in un oggetto messaggio di risposta Http (un'istanza HttpResponseMessage viene creata in modo asincrono) e lo restituisce. L'utilizzo dell'interfaccia IHttpActionResult (introdotta nell'API Web 2) semplifica il test delle unità dei controller dell'API Web e include anche la creazione di un oggetto HttpResponseMessage.
  • void: in questo caso, la tua API Web restituirebbe una risposta Http vuota con un codice di stato 204.
  • Altri tipi: in questo caso, l'API Web trarrebbe vantaggio dal formattatore multimediale appropriato per serializzare e restituire i dati dal metodo del controller dell'API Web con un codice di stato della risposta di 200.

Il frammento di codice seguente mostra come utilizzare HttpResponseMessage di ritorno dal metodo del controller dell'API Web.

 [Route("contact")]

public HttpResponseMessage Get()

{

    HttpResponseMessage message = Request.CreateResponse(HttpStatusCode.OK, contact);

    return message;

}

Implementiamo ora un risultato di azione personalizzato che useremo per restituire i dati dall'API Web che abbiamo creato.

Creazione di un ActionResult personalizzato

Per creare una classe di risultati dell'azione personalizzata, tutto ciò che devi fare è creare una classe che implementi l'interfaccia IActionResult e sovrascriva il metodo ExecuteAsync.

Il seguente frammento di codice mostra come utilizzare Generics per creare una classe di risultati di azione personalizzata.

public class CustomActionResult : IHttpActionResult

    {

        private System.Net.HttpStatusCode statusCode;

        T data;

        public CustomActionResult(System.Net.HttpStatusCode statusCode, T data)

        {

            this.statusCode = statusCode;

            this.data = data;

        }

    }

Il seguente frammento di codice mostra come creare l'oggetto risposta, popolarlo con i dati necessari e restituirlo.

public HttpResponseMessage CreateResponse(System.Net.HttpStatusCode statusCode, T data)

        {

            HttpRequestMessage request = new HttpRequestMessage();            request.Properties.Add(System.Web.Http.Hosting.HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration());

            HttpResponseMessage response = request.CreateResponse(statusCode, data);

            return response;

        }

Il metodo ExecuteAsync chiama il metodo CreateResponse e gli passa il codice di stato e i dati come parametro.

        public Task ExecuteAsync(CancellationToken cancellationToken)

        {

            return Task.FromResult(CreateResponse(this.statusCode, this.data));

        }

Consumare l'API Web

Per utilizzare l'API Web appena creata, è possibile creare un'applicazione console e quindi importare il pacchetto "WebApiContrib.Formatting.ProtoBuf" nel progetto tramite NuGet.

Supponendo che tu abbia creato il client per utilizzare l'API Web che abbiamo implementato in precedenza, ecco l'elenco di codice che mostra come puoi utilizzare l'API Web.

static void Main(string[] args)

        {

            var client = new HttpClient { BaseAddress = new Uri("//localhost:37019/") };

            HttpResponseMessage response = client.GetAsync("api/Default").Result;

            if (response.IsSuccessStatusCode)

            {

                Contact contact = response.Content.ReadAsAsync().Result;

                Console.WriteLine("Id = "+ contact.Id + " First Name: " + contact.FirstName + " Last Name: " + contact.LastName);

            }

            else

            {

                Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);

            }

            Console.ReadKey();

        }