Jak przekazać wiele parametrów do metod kontrolera interfejsu API sieci Web

We wcześniejszym poście omówiliśmy wiązanie parametrów w interfejsie Web API. W tym poście dowiemy się, jak przekazać wiele parametrów do metod kontrolera interfejsu API sieci Web.

Interfejs API sieci Web zapewnia niezbędne metody akcji dla operacji HTTP GET, POST, PUT i DELETE. Zwykle pojedynczy obiekt jest przekazywany jako parametr do metod akcji PUT i POST. Należy pamiętać, że interfejs API sieci Web nie obsługuje domyślnie przekazywania wielu parametrów POST do metod kontrolera interfejsu API sieci Web. Ale co by było, gdybyś wysłał żądanie POST z wieloma obiektami przekazanymi jako parametry do metody kontrolera interfejsu API sieci Web?

Zrozumienie problemu

Interfejs API sieci Web nie umożliwia przekazywania wielu złożonych obiektów w sygnaturze metody kontrolera interfejsu API sieci Web - można opublikować tylko jedną wartość w metodzie akcji interfejsu API sieci Web. Ta wartość z kolei może być nawet złożonym obiektem. Możliwe jest przekazanie wielu wartości w operacji POST lub PUT, mapując jeden parametr na rzeczywistą zawartość, a pozostałe za pomocą ciągów zapytań.

Poniższa klasa kontrolera zawiera metodę POST o nazwie Save, która akceptuje wiele parametrów.

public class AuthorsController: ApiController

    {

        [HttpPost]

        public HttpResponseMessage Save (int Id, string FirstName, string LastName, string Address)

        {

            // Zwykły kod

            return Request.CreateResponse (HttpStatusCode.OK, "Sukces ...");

        }

   }

Teraz załóżmy, że spróbujesz wywołać metodę kontrolera interfejsu API sieci Web z JQuery, jak pokazano poniżej.

$ .ajax ({

 url: 'api / autorów',

 typ: 'POST',

 data: {Id: 1, FirstName: 'Joydip', LastName: 'Kanjilal', Address: 'Hyderabad'},

 dataType: 'json',

 sukces: funkcja (dane) {

alert (dane);

}});

Niestety to wywołanie zakończy się niepowodzeniem, ponieważ tego żądania nie można przetworzyć przez interfejs API sieci Web. Podobnie, jeśli masz metodę kontrolera interfejsu API sieci Web, która akceptuje wiele złożonych obiektów, nie możesz wywołać tej metody bezpośrednio z klienta w prosty sposób.

[HttpPost]

public HttpResponseMessage PostAuthor (autor autora, string authenticationToken)

{

  // Zwykły kod

  return Request.CreateResponse (HttpStatusCode.OK, "Sukces ...");

}

Parametry można przekazywać do metod kontrolera interfejsu API sieci Web przy użyciu atrybutów [FromBody] lub [FromUri]. Zauważ, że atrybut [FromBody] może być użyty tylko raz na liście parametrów metody. Aby powtórzyć, możesz przekazać tylko jedną wartość (typ prosty lub złożony) jako parametr do metody kontrolera interfejsu API sieci Web podczas korzystania z atrybutu [FromBody]. Możesz przekazać dowolną liczbę parametrów za pomocą atrybutu [FromUri], ale nie jest to idealne rozwiązanie w naszym przypadku.

A teraz rozwiązanie

Teraz, gdy zrozumieliśmy, na czym polega problem podczas przekazywania parametrów do metody kontrolera interfejsu API sieci Web, zbadajmy możliwe rozwiązania. Jednym ze sposobów osiągnięcia tego jest przekazanie złożonego obiektu jako atrybutu [FromBody] i parametru ciągu za pośrednictwem Uri, jak pokazano w poniższym fragmencie kodu.

$ .ajax ({

 url: 'api / autorów? authenticationToken = abcxyz',

 typ: 'POST',

  data: JSON.stringify (autor),

 dataType: 'json',

 sukces: funkcja (dane) {

   alert (dane);

}});

Musisz odpowiednio zmodyfikować metodę kontrolera interfejsu API sieci Web, aby przeanalizować ciąg zapytania, jak pokazano poniżej.

[HttpPost]

public HttpResponseMessage PostAuthor (autor autor)

{

  var data = Request.RequestUri.ParseQueryString ();

  kryteria string = queryItems ["authenticationToken"];

  // Zwykły kod do przechowywania danych w bazie danych

  return Request.CreateResponse (HttpStatusCode.OK, "Sukces ...");

}

Cóż, ale co, jeśli masz wiele złożonych obiektów, które mają być przekazane jako parametry do metody kontrolera interfejsu API sieci Web? Możesz utworzyć pojedynczy obiekt, który otacza wiele parametrów. Zapoznaj się z klasą AuthorRequest podaną poniżej.

publiczna klasa AuthorRequest

   {

      public Autor Autor {get; zestaw; }

      public string Token {get; zestaw; }

   }

Zasadniczo można opakować wiele parametrów w jedną klasę i użyć tej klasy jako parametru metody kontrolera interfejsu API sieci Web.

Oto zaktualizowana metoda kontrolera interfejsu API sieci Web.

[HttpPost]

public HttpResponseMessage PostAuthor (żądanie AuthorRequest)

  {

       var autor = request.Author;

       var token = request.Token;

       // Zwykły kod do przechowywania danych w bazie danych

       return Request.CreateResponse (HttpStatusCode.OK, "Sukces ...");

  }

Możesz również użyć JObject, aby przeanalizować wiele wartości parametrów z obiektu.

[HttpPost]

public HttpResponseMessage PostAuthor (JObject jsonData)

{

    dynamiczny json = jsonData;

    JObject jauthor = json.Author;

    string token = json.Token;

    var autor = jauthor.ToObject ();

    // Zwykły kod do przechowywania danych w bazie danych

    return Request.CreateResponse (HttpStatusCode.OK, "Sukces ...");

}

Innym sposobem rozwiązania tego problemu jest użycie FormDataCollection. Nawiasem mówiąc, FormDataCollection jest kolekcją par klucz / wartość, podobnie jak FormCollection w MVC.

[HttpPost]

        public HttpResponseMessage PostAuthor (formularz FormDataCollection)

        {

            var autor = form.Get ("Autor");

            var token = form.Get ("Token");

            // Zwykły kod do przechowywania danych w bazie danych

            return Request.CreateResponse (HttpStatusCode.OK, "Sukces ...");

        }

Dzięki rozszerzalności struktury interfejsu API sieci Web można również utworzyć własny spinacz parametrów niestandardowych, rozszerzając klasę HttpParameterBinding, aby zapewnić obsługę wielu powiązań parametrów.

Jak zrobić więcej w ASP.NET i ASP.NET Core:

  • Jak korzystać z buforowania w pamięci w ASP.NET Core
  • Jak obsługiwać błędy w ASP.NET Web API
  • Jak przekazać wiele parametrów do metod kontrolera interfejsu API sieci Web
  • Jak rejestrować metadane żądań i odpowiedzi w ASP.NET Web API
  • Jak pracować z HttpModules w ASP.NET
  • Zaawansowane przechowywanie wersji w ASP.NET Core Web API
  • Jak używać iniekcji zależności w ASP.NET Core
  • Jak pracować z sesjami w ASP.NET
  • Jak pracować z HTTPHandlers w ASP.NET
  • Jak używać IHostedService w ASP.NET Core
  • Jak korzystać z usługi WCF SOAP w ASP.NET Core
  • Jak poprawić wydajność aplikacji ASP.NET Core
  • Jak korzystać z ASP.NET Core Web API przy użyciu RestSharp
  • Jak pracować z rejestrowaniem w ASP.NET Core
  • Jak używać MediatR w ASP.NET Core
  • Jak pracować ze stanem sesji w ASP.NET Core
  • Jak używać Nancy w ASP.NET Core
  • Zrozumienie powiązania parametrów w ASP.NET Web API
  • Jak przekazywać pliki w ASP.NET Core MVC
  • Jak zaimplementować globalną obsługę wyjątków w ASP.NET Core Web API
  • Jak zaimplementować kontrole kondycji w ASP.NET Core
  • Najlepsze rozwiązania dotyczące buforowania w ASP.NET
  • Jak korzystać z obsługi wiadomości Apache Kafka w .NET
  • Jak włączyć CORS w swoim internetowym interfejsie API
  • Kiedy używać WebClient, HttpClient, a kiedy HttpWebRequest
  • Jak pracować z pamięcią podręczną Redis w .NET
  • Kiedy używać Task.WaitAll, a kiedy Task.WhenAll w .NET