Как да работя с ActionResults в уеб API

ASP.Net Web API е лека рамка, използвана за изграждане на бездържавни и RESTful HTTP услуги. Можете да се възползвате от резултатите от действията в уеб API, за да върнете данни от методите на контролера на уеб API.

Приготвяме се да започнем

Нека първо създадем проект за уеб API. За да направите това, създайте празен ASP.Net проект в Visual Studio 2015 и поставете отметка в квадратчето за уеб API, когато избирате шаблона на проекта. След това запишете проекта с име.

Ще забележите, че е създаден празен проект на ASP.Net. Щракнете с десния бутон върху папката с решение Controllers и щракнете върху Add -> Controller, за да създадете нов контролер на Web API. Изберете "Web API 2 Controller - Empty", когато бъдете подканени в прозореца, който се появява след това. Запазете контролера с име. Нека приемем, че името на контролера за този пример е "DefaultController".

Нека създадем клас на обект, наречен Contact.

public class Contact

    {

        public int Id { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

    }

След това добавете следния метод към DefaultController.

public CustomActionResult Get()

        {

            Contact contact = new Contact();

            contact.Id = 1;

            contact.FirstName = "Joydip";

            contact.LastName = "Kanjilal";

            return new CustomActionResult(HttpStatusCode.OK, contact);

        }

Обърнете внимание на използването на класа CustomActionResult, докато връщате данни от метода на контролера. Сега нека създадем клас CustomActionResult, само за да сме сигурни, че вашият код се компилира - ще приложим този клас по-късно.

public class CustomActionResult : IHttpActionResult

    {

        public Task ExecuteAsync(CancellationToken cancellationToken)

        {

            throw new NotImplementedException();

        }

    }

Работа с ActionResults

Вашият уеб API контролер може да върне всеки един от следните типове стойности:

  • HttpResponseMessage: в този случай вашият уеб API ще преобразува връщаната стойност в обект на съобщение за отговор Http и ще я върне.
  • IHttpActionResult: в този случай изпълнението на Web API преобразува връщаната стойност в обект на съобщение за отговор на Http (екземпляр HttpResponseMessage се създава асинхронно) и го връща. Използването на интерфейса IHttpActionResult (въведен в Web API 2) опростява модулното тестване на вашите уеб API контролери и също така обгръща създаването на обект HttpResponseMessage.
  • void: в този случай вашият уеб API ще върне празен Http отговор със код на състоянието 204.
  • Други типове: в този случай вашият уеб API ще се възползва от подходящия форматиращ носител за сериализиране и връщане на данни от метода на контролера на уеб API с код на състоянието на отговор 200.

Следният кодов фрагмент показва как можете да използвате return HttpResponseMessage от метода на вашия уеб API контролер.

 [Route("contact")]

public HttpResponseMessage Get()

{

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

    return message;

}

Нека сега внедрим персонализиран резултат от действието, който ще използваме за връщане на данни от създадения от нас уеб API.

Създаване на персонализиран ActionResult

За да създадете персонализиран клас на резултат за действие, всичко, което трябва да направите, е да създадете клас, който реализира интерфейса IActionResult и замества метода ExecuteAsync.

Следният кодов фрагмент показва как можете да използвате Generics, за да създадете персонализиран клас резултат на действие.

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;

        }

    }

Следният кодов фрагмент показва как можете да създадете обект за отговор, да го попълните с необходимите данни и да го върнете.

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;

        }

Методът ExecuteAsync извиква метода CreateResponse и му предава статутния код и данните като параметър.

        public Task ExecuteAsync(CancellationToken cancellationToken)

        {

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

        }

Консумиране на уеб API

За да консумирате току-що създадения от вас уеб API, можете да създадете конзолно приложение и след това да импортирате пакета „WebApiContrib.Formatting.ProtoBuf“ във вашия проект чрез NuGet.

Ако приемем, че сте създали клиента да използва уеб API, който сме внедрили по-рано, ето списъкът с кодове, който показва как можете да консумирате Web Api.

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();

        }