Programiranje

Kako implementirati DelegatingHandler za X-HTTP-Method-Override v spletni API

Pri uvajanju spletnega API-ja REST v javni domeni boste včasih naleteli na težave, povezane s podporo za glagole HTTP. Dva izziva v zvezi s tem sta omejena podpora glagolom HTTP v starih spletnih brskalnikih (tj. Podpirajo samo HTTP GET in HTTP POST) in agresivni požarni zidovi, ki blokirajo promet, ki ni niti HTTP GET niti HTTP POST. Kako bo vaša aplikacija v teh primerih podpirala PUT ali DELETE? Tukaj na pomoč priskoči glava X-HTTP-Method-Override HTTP.

Glava HTTP X-HTTP-Method-Override deluje nekako podobno kot kramp. Glavo lahko dodate z vrednostjo PUT ali DELETE, ko prikličete svoj spletni API prek JavaScript ali prek XMLHttpRequest predmet iz spletnega brskalnika s klicem HTTP POST. Nato lahko naročnik, ki ga pooblasti, prestreže metodo HTTP, ki jo je treba priklicati, in izvede ustrezne ukrepe.

V tem članku bom razpravljal o tem, kako lahko uporabimo upravljalnik za prenos pred cevovodom zahteva-odgovor, da spremenimo zahtevo za pošiljanje veljavnega sporočila v našo aplikacijo ali spremenimo odgovor, da stranki vrnemo veljaven odgovor.

Glagoli HTTP in prenosniki

Če smo zaradi omejitev, ki jih nalaga vaš odjemalec, spletni brskalnik ali požarni zid pred vašo spletno aplikacijo, omejeni na uporabo samo glagolov HTTP GET in POST, bomo morali uporabiti rešitev za podporo PUT in DELETE. Ta rešitev običajno vključuje dodajanje glave HTTP X-HTTP-Method-Override zahtevi, ki določa glagol, ki ga želimo uporabiti v klicu HTTP POST. Poleg tega v naši aplikaciji potrebujemo pooblastilo za prenos, ki preveri glavo in, če obstaja, pokliče metodo HTTP, ki jo želite priklicati.

Preden se poglobimo v izvedbo, si na hitro poglejmo, kaj so pooblaščenci, ki jih pooblaščajo, in zakaj bi ga uporabili tukaj. Obdelovalni posrednik in drugi obdelovalci sporočil se izvedejo zgodaj v cevovodu za obdelavo zahtev. To so razredi, ki sprejemajo zahteve HTTP in vrnejo odgovor HTTP. Prenosni vodniki so podobni HttpModules v ASP.Net. Ampak za razliko HttpModules, pooblaščenci za prenos pooblaščencev so lahko privezani: en pooblaščenec za posredovanje se lahko sklicuje na drugega pooblaščenca za prenos. Več o prenosu voditeljev lahko izveste iz mojega prejšnjega članka »Kako delati z upravljavci sporočil v spletnem API-ju«.

Ustvarite krmilnik spletnega API-ja

Predpostavimo, da imate podoben krmilnik spletnega API-ja:

javni razred AuthorsController: ApiController

    {

// GET: api / avtorji

javni IEnumerable Get ()

        {

vrni nov niz [] {“Joydip”, “Kanjilal”};

        }

// GET: api / avtorji / 1

javni niz Get (int id)

        {

vrnitev “Joydip Kanjilal”;

        }

// POST api / avtor

javna void objava ([avtor avtorja]) {}

// PUT api / avtor / 1

public void Put (int id, [FromBody] Vrednost avtorja) {}

// IZBRIŠI api / avtor / 1

public void Delete (int id) {}

    }

Ustvarite DelegatingHandler za X-HTTP-Method-Override

Zdaj pa uvedimo obravnavalec X-HTTP-Method-Override. To je obdelovalec sporočil, zato bi moral kot običajno razširiti DelegatingHander razred.

javni razred CustomMessageHandler: DelegatingHandler

    {

samo za branje niz [] httpMethodsList = {“IZBRIŠI”, “GLAVA”, “PUT”};

niz const httpMethodOverrideheader;

zaščiteno preglasitev opravila SendAsync (zahteva HttpRequestMessage, CancellationToken cancellationToken)

        {

če (request.Method == HttpMethod.Post && request.Headers.Contains (httpMethodOverrideheader))

            {               

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

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

                {                  

request.Method = nova HttpMethod (httpMethod);

                }

            }

return base.SendAsync (zahteva, odpovedToken);

        }

    }

Koda je povsem samoumevna. Preveri, ali obstaja HTTP POST z glavo X-HTTP-Method-Override. Če je glava na seznamu metod, se metoda zahteve spremeni.

Registrirajte DelegatingHandler

Naslednji korak je registracija upravljavca. To lahko storite tako, da dodate novega vodnika v zbirko MessageHandlers v razredu WebApiConfig, kot je prikazano v spodnjem delčku kode.

javni statični void Register (HttpConfiguration config)

{

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

// Poti spletnega API-ja

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

ime: "DefaultApi",

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

privzeto: novo {id = RouteParameter.O optional}

    );

}

Druga možnost je, da lahko registracijski posrednik za registracijo registrirate s pomočjo Application_Start dogodka v datoteki Global.asax.cs, kot je prikazano spodaj.

zaščitena praznina Application_Start (pošiljatelj predmeta, EventArgs e)

        {

RegisterRoutes (RouteTable.Routes);

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

        }

To je vse, kar morate storiti na strani strežnika. Na strani odjemalca, tj. Iz spletnega brskalnika, morate dodati glavo preglasitve, kot je prikazano v spodnjem delčku kode.

$ .ajax ({

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

vrsta: “POST”,

podatki: JSON.stringify (authorData),

glave: {

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

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

})

Kot lahko vidite v prejšnjem delčku kode, morate v glavi zahteve določiti način HTTP, ki ga želite priklicati -Preglasitev metode X-HTTP: IZBRIŠI ali Preglasitev metode X-HTTP: PUT- in nato pokličite POST na svoj vir.

$config[zx-auto] not found$config[zx-overlay] not found