Meine zwei Cent für die Verwendung der IHttpActionResult-Schnittstelle in WebAPI

Die WebAPI von Microsoft ist seit geraumer Zeit das bevorzugte Framework für die Erstellung von RESTful-Diensten, die über HTTP funktionieren können. Die IHttpActionResult-Schnittstelle wurde mit WebAPI Version 2 eingeführt und bietet eine andere Möglichkeit, Antworten von Ihren WebAPI-Controller-Methoden zurückzusenden. Sie nutzt asynchron und wartet standardmäßig.

Im Wesentlichen ist IHttpActionResult eine Factory für HttpResponsemessage. Die IHttpActionResult-Schnittstelle ist im System.Web.Http-Namespace enthalten und erstellt asynchron eine Instanz von HttpResponseMessage. Das IHttpActionResult umfasst eine Sammlung von benutzerdefinierten integrierten Antworten, darunter: Ok, BadRequest, Exception, Conflict, Redirect, NotFound und Unauthorized.

Die IHttpActionResult-Schnittstelle enthält nur eine Methode. So sieht diese Oberfläche aus:

namespace System.Web.Http

{

    public interface IHttpActionResult

    {

        Task ExecuteAsync(CancellationToken cancellationToken);

    }

}

Sie können eine benutzerdefinierte Antwort mit einer der unten aufgeführten Hilfsmethoden der ApiController-Klasse zurückgeben.

Ok

NotFound

Exception

Unauthorized

BadRequest

Conflict

Redirect

InvalidModelState

Rückgabe der Antwort von WebAPI-Controller-Methoden

In diesem Abschnitt werden wir untersuchen, wie wir IHttpActionResult nutzen können, um Antworten von den Controller-Methoden zurückzusenden.

Betrachten Sie nun den folgenden WebApi-Controller:

public class DefaultController : ApiController

    {

        private readonly DemoRepository repository = new DemoRepository();

        public HttpResponseMessage Get(int id)

        {

            var result = repository.GetData(id);

            if (result != null)

                return Request.CreateResponse(HttpStatusCode.OK, result);

            return Request.CreateResponse(HttpStatusCode.NotFound);

        }

    }

Beachten Sie, dass jeweils der entsprechende Statuscode zurückgegeben wird, dh wenn Daten verfügbar sind, wird HttpStatusCode.OK zurückgegeben, während HttpStatusCode.NotFound zurückgegeben wird, wenn keine Daten verfügbar sind.

Lassen Sie uns nun sehen, wie dieselbe Controller-Methode geändert werden kann, um die Antwort als IHttpActionResult zurückzugeben. Hier ist der aktualisierte Code der Controller-Methode als Referenz. Beachten Sie, wie HttpResponseMessage durch IHttpActionResult ersetzt wurde.

public IHttpActionResult Get(int id)

        {

            var result = repository.GetData(id);

            if (result == null)

                return NotFound();

            return Ok(result);

        }

Siehe die oben angegebene Get-Methode. Der Code ist sehr einfach und schlank und abstrahiert die Art und Weise, wie die HTTP-Nachricht tatsächlich im Controller erstellt wird. Und hier ist ein weiteres Beispiel.

Lesen Sie das folgende Codefragment, das HttpResponseMessage zurückgibt, um Erfolg oder Misserfolg zu melden.

public HttpResponseMessage Delete(int id)

        {

            var status = repository.Delete(id);

            if (status)

               return new HttpResponseMessage(HttpStatusCode.OK);

            return new HttpResponseMessage(HttpStatusCode.NotFound);

        }

Sehen Sie nun, wie dieselbe Aktionsmethode mithilfe von IHttpActionResult überarbeitet werden kann, um den Code schlanker und einfacher zu gestalten.

public IHttpActionResult Delete(int id)

        {

            var status = repository.Delete(id);

            if (status)

              return Ok();

            return NotFound();

        }

Welches soll ich verwenden und warum?

Sollten wir also IHttpActionResult über HttpResponseMessage in unseren WebAPI-Controllern verwenden, wenn wir die Antworten zurücksenden? Hier ist meine Antwort auf diese Frage. Ich würde IHttpActionResult immer HttpResponseMessage vorziehen, da dadurch das Unit-Testen der Controller vereinfacht würde. Sie können die allgemeine Logik zum Erstellen von HTTP-Antworten auf andere Klassen verschieben und Ihre Controller-Methoden schlank und einfach gestalten. Im Wesentlichen würden die Details auf niedriger Ebene beim Erstellen der HTTP-Antworten gekapselt.

In einem anderen Punkt ist es erwähnenswert, dass Sie bei der Verwendung von IHttpActionResult das Prinzip der Einzelverantwortung einhalten können und sich Ihre Aktionsmethoden auf die Behandlung der HTTP-Anforderungen konzentrieren können, anstatt die HTTP-Antwortnachrichten zu erstellen. Es gibt noch einen weiteren erwähnenswerten Punkt. Sie können IHttpActionResult nutzen, um HTML mit Razor zu unterstützen. Sie müssen lediglich ein benutzerdefiniertes Aktionsergebnis erstellen, mit dem Razor-Ansichten analysiert werden können. Das Erstellen eines benutzerdefinierten Aktionsergebnisses ist einfach. Sie müssten lediglich die IHttpActionResult-Schnittstelle erweitern und dann Ihre eigene Version der ExecuteAsync-Methode implementieren.