Kako implementirati DelegatingHandler za nadjačavanje metode X-HTTP-a u web API-ju

Kada postavljate svoj REST web API preko javne domene, ponekad ćete naići na probleme koji su povezani s podrškom za HTTP glagole. Dva su izazova u tom pogledu ograničena podrška za HTTP glagole u starim web preglednicima (tj. Podržavaju samo HTTP GET i HTTP POST) i agresivni vatrozidi koji blokiraju promet koji nije niti HTTP GET niti HTTP POST. Kako će vaša aplikacija podržati PUT ili DELETE u tim slučajevima? Ovdje točno dolazi do spašavanja HTTP zaglavlje X-HTTP-Method-Override.

HTTP zaglavlje X-HTTP-Method-Override djeluje nekako slično hakiranju. Možete dodati zaglavlje s vrijednošću PUT ili DELETE kada pozivate svoj web API putem JavaScript-a ili putem XMLHttpRequestobjekta iz web-preglednika pomoću HTTP POST poziva. Tada možete zatražiti da rukovatelj delegiranjem presretne HTTP metodu i poduzme odgovarajuće radnje.

U ovom ću članku razgovarati o tome kako možemo koristiti rukovatelj delegiranjem ispred cjevovoda zahtjev-odgovor da bismo izmijenili zahtjev za slanje važeće poruke u našu aplikaciju ili izmijenili odgovor da bismo klijentu poslali valjani odgovor.

HTTP glagoli i delegirajući obrađivači

Ako smo ograničeni na upotrebu samo HTTP glagola GET i POST zbog ograničenja koja nameće vaš klijent, web preglednik ili vatrozid ispred vaše web aplikacije, morat ćemo implementirati zaobilazno rješenje za podršku PUT and DELETE. Ovo zaobilazno rješenje obično uključuje dodavanje HTTP zaglavlja X-HTTP-Method-Override zahtjevu koji navodi glagol koji želimo koristiti u HTTP POST pozivu. Uz to, u našoj aplikaciji potreban nam je upravljač delegiranjem koji provjerava zaglavlje i, ako postoji, upućuje poziv HTTP metodi koju želite pozvati.

Prije nego što krenemo u implementaciju, pogledajmo na brzinu što su delegirajući obrađivači i zašto bismo ga ovdje koristili. Rukovatelj za delegiranje i drugi obrađivači poruka izvršavaju se rano u cjevovodu za obradu zahtjeva. To su klase koje prihvaćaju HTTP zahtjeve i vraćaju HTTP odgovor. Delegiranje rukovatelja je slično kao HttpModulesu ASP.Net. Ali za razliku od toga HttpModules, rukovatelji za delegiranje mogu biti lancima: Jedan rukovatelj za delegiranje može se pozvati na drugi rukovatelj za delegiranje. O delegiranju rukovatelja možete saznati iz mog prethodnog članka "Kako raditi s rukovačima porukama u web API-ju."

Stvorite kontroler web API-ja

Pretpostavimo da imate kontroler Web API-ja sličan ovom:

javna klasa AuthorsController: ApiController

    {

        // GET: api / autori

        javni IEnumerable Get ()

        {

            vrati novi niz [] {“Joydip”, “Kanjilal”};

        }

        // GET: api / autori / 1

        javni niz Get (int id)

        {

            povratak “Joydip Kanjilal”;

        }

        // POST api / autor

        javna praznina Post ([FromBody] Vrijednost autora) {}

        // PUT api / autor / 1

        javna praznina Put (int id, [FromBody] Vrijednost autora) {}

        // IZBRIŠI api / autor / 1

        javna praznina Izbriši (int id) {}

    }

Stvorite DelegatingHandler za nadjačavanje metode X-HTTP

Sada ćemo implementirati X-HTTP-Method-Override obrađivač. Ovo je rukovatelj porukama, pa bi kao i obično trebao proširiti DelegatingHandlerrazred.

javna klasa CustomMessageHandler: DelegatingHandler

    {

        samo za čitanje string [] httpMethodsList = {“DELETE”, “HEAD”, “PUT”};

        const string httpMethodOverrideheader;

        zaštićeno nadjačavanje zadataka SendAsync (zahtjev za HttpRequestMessage, CancellationToken cancellationToken)

        {

            if (request.Method == HttpMethod.Post && request.Headers.Contens (httpMethodOverrideheader))

            {               

                var httpMethod = request.Headers.GetValues ​​(httpMethodOverrideheader) .FirstOrDefault ();

                if (httpMethodsList.Contains (httpMethod, StringComparer.InvariantCultureIgnoreCase))

                {                  

                    request.Method = nova HttpMethod (httpMethod);

                }

            }

            return base.SendAsync (zahtjev, otkazivanjeToken);

        }

    }

Kôd je prilično objašnjen. Provjerava HTTP POST koji ima zaglavlje X-HTTP-Method-Override. Ako se zaglavlje nalazi na popisu metoda, metoda zahtjeva se mijenja.

Registrirajte DelegatingHandler

Sljedeći je korak registracija voditelja. To možete učiniti dodavanjem ovog novog rukovatelja u kolekciju MessageHandlers u klasi WebApiConfig, kao što je prikazano u isječku koda u nastavku.

javni statički void Registar (HttpConfiguration config)

{

    config.MessageHandlers.Add (novi CustomMessageHandler ());

     // Web API rute

    config.MapHttpAttributeRoutes ();

     config.Routes.MapHttpRoute (

        ime: "DefaultApi",

        routeTemplate: “api / {kontroler} / {id}”,

        zadane vrijednosti: novo {id = RouteParameter.O optional}

    );

}

Alternativno, rukovatelj za delegiranje možete registrirati pomoću Application_Startobrađivača događaja u datoteci Global.asax.cs kao što je prikazano dolje.

zaštićena praznina Application_Start (pošiljatelj objekta, EventArgs e)

        {

            RegisterRoutes (RouteTable.Routes);

            GlobalConfiguration.Configuration.MessageHandlers.Add (novi CustomMessageHandler ());

        }

To je sve što morate učiniti na strani poslužitelja. Na klijentskoj strani, tj. Iz web preglednika, trebali biste osigurati dodavanje zaglavlja nadjačavanja kao što je prikazano u isječku koda u nastavku.

$ .ajax ({

  url: “// localhost: 9820 / api / Authors / 1”,

  tip: “POST”,

  podaci: JSON.stringify (authorData),

  zaglavlja: {

      “Content-Type”: “application / json”,

      “X-HTTP-Method-Override”: “PUT”},

})

Kao što možete vidjeti u prethodnom isječku koda, sve što trebate jest odrediti HTTP metodu koju želite pozvati u zaglavlju zahtjeva - X-HTTP-Method-Override : DELETEili X-HTTP-Method-Override : PUT- i zatim uputiti POST poziv na svoj resurs.