Pri nasadení vášho webového rozhrania REST Web API na verejnú doménu sa niekedy stretnete s problémami, ktoré súvisia s podporou slovies HTTP. Dvomi výzvami v tejto súvislosti sú obmedzená podpora pre slovesá HTTP v starých webových prehliadačoch (t. J. Podporujú iba HTTP GET a HTTP POST) a agresívne brány firewall, ktoré blokujú prenos, ktorý nie je ani HTTP GET, ani HTTP POST. Ako bude vaša aplikácia v týchto prípadoch podporovať PUT alebo DELETE? Presne tu prichádza na pomoc hlavička HTTP X-HTTP-Method-Override HTTP.
Hlavička HTTP X-HTTP-Method-Override funguje do istej miery ako hack. Hlavičku s hodnotou PUT alebo DELETE môžete pridať pri vyvolaní vášho webového API pomocou JavaScriptu alebo pomocou XMLHttpRequest
objekt z webového prehliadača pomocou volania HTTP POST. Potom môžete nechať delegujúcu obslužnú rutinu zachytiť metódu HTTP, ktorá sa má vyvolať, a vykonať príslušné akcie.
V tomto článku budem diskutovať o tom, ako môžeme použiť delegujúci obslužný program pred plynovodom požiadaviek a odpovedí na zmenu žiadosti o odoslanie platnej správy do našej aplikácie alebo zmeny odpovede na odoslanie platnej odpovede klientovi späť.
Slovesá HTTP a obslužné rutiny delegovania
Ak sme nútení používať iba slovesá HTTP GET a POST z dôvodu obmedzení stanovených vašim klientom, webovým prehliadačom alebo bránou firewall, ktorá sa nachádza vo vašej webovej aplikácii, budeme musieť implementovať riešenie podporujúce PUT a DELETE. Toto riešenie zvyčajne zahŕňa pridanie hlavičky HTTP X-HTTP-Method-Override k požiadavke, ktorá určuje sloveso, ktoré chceme použiť v rámci hovoru HTTP POST. Okrem toho v našej aplikácii potrebujeme delegujúci obslužný program, ktorý kontroluje hlavičku a ak existuje, zavolá metódu HTTP, ktorú chcete vyvolať.
Predtým, ako sa ponoríme do implementácie, poďme sa v krátkosti pozrieť na to, čo sú delegujúce manipulátory a prečo by sme ich tu používali. Obslužná rutina delegovania a ďalšie obslužné rutiny správ sa vykonajú na začiatku procesu spracovania požiadaviek. Jedná sa o triedy, ktoré prijímajú požiadavky HTTP a vracajú odpoveď HTTP. Delegujúci manipulátori sú podobní ako HttpModules
v ASP.Net. Ale na rozdiel od HttpModules
, delegujúce obslužné rutiny môžu byť pripútané: Jeden delegujúci obslužný program môže odkazovať na iného delegujúceho obslužného programu. Viac informácií o delegovaní obslužných rutín sa dozviete z môjho predchádzajúceho článku „Ako pracovať so spracovateľmi správ vo webovom rozhraní API.“
Vytvorte radič webového rozhrania API
Predpokladajme, že máte podobný radič webového API:
verejná trieda AuthorsController: ApiController{
// ZÍSKAJTE: api / autori
verejné IEnumerable Get ()
{
vrátiť nový reťazec [] {“Joydip”, “Kanjilal”};
}
// ZÍSKAJTE: api / autori / 1
verejný reťazec Get (int id)
{
návrat „Joydip Kanjilal“;
}
// POST api / autor
public void Post ([FromBody] hodnota autora) {}
// PUT api / autor / 1
public void Put (int id, [FromBody] hodnota autora) {}
// ODSTRÁNIŤ api / autora / 1
public void Delete (int id) {}
}
Vytvorte DelegatingHandler pre prepísanie metódy X-HTTP
Teraz implementujme obslužný program X-HTTP-Method-Override. Toto je obsluha správ, takže ako obvykle by sa mala rozširovať DelegatingHandler
trieda.
verejná trieda CustomMessageHandler: DelegatingHandler{
reťazec iba na čítanie [] httpMethodsList = {„DELETE“, „HEAD“, „PUT“};
reťazec const httpMethodOverrideheader;
chránené prepísanie úlohy SendAsync (požiadavka HttpRequestMessage, CancellationToken cancellationToken)
{
if (request.Method == HttpMethod.Post && request.Headers.Contains (httpMethodOverrideheader))
{
var httpMethod = request.Headers.GetValues (httpMethodOverrideheader) .FirstOrDefault ();
if (httpMethodsList.Contains (httpMethod, StringComparer.InvariantCultureIgnoreCase))
{
request.Method = nový HttpMethod (httpMethod);
}
}
návratová základňa.SendAsync (požiadavka, stornoToken);
}
}
Tento kód je úplne zrejmý. Kontroluje HTTP POST, ktorý má hlavičku X-HTTP-Method-Override. Ak je hlavička v zozname metód, spôsob požiadavky sa zmení.
Zaregistrujte DelegatingHandler
Ďalším krokom je registrácia obsluhy. Môžete to urobiť pridaním tohto nového obslužného programu do kolekcie MessageHandlers v triede WebApiConfig, ako je uvedené v útržku kódu nižšie.
verejný statický neplatný register (konfigurácia HttpConfiguration){
config.MessageHandlers.Add (nový CustomMessageHandler ());
// trasy webového API
config.MapHttpAttributeRoutes ();
config.Routes.MapHttpRoute (
názov: „DefaultApi“,
routeTemplate: “api / {controller} / {id}”,
predvolené hodnoty: new {id = RouteParameter.Optional}
);
}
Prípadne môžete delegovať obsluhu zaregistrovať pomocou Application_Start
obslužná rutina udalosti v súbore Global.asax.cs, ako je uvedené nižšie.
protected void Application_Start (odosielateľ objektu, EventArgs e){
RegisterRoutes (RouteTable.Routes);
GlobalConfiguration.Configuration.MessageHandlers.Add (nový CustomMessageHandler ());
}
To je všetko, čo musíte urobiť na strane servera. Na strane klienta, t. J. Z webového prehliadača, by ste sa mali ubezpečiť, že ste pridali hlavičku prepísania, ako je uvedené v útržku kódu nižšie.
$ .ajax ({url: „// localhost: 9820 / api / Authors / 1“,
typ: „POST“,
údaje: JSON.stringify (authorData),
hlavičky: {
„Content-Type“: „application / json“,
“X-HTTP-Method-Override”: “PUT”},
})
Ako vidíte v predchádzajúcom úryvku kódu, všetko, čo musíte urobiť, je zadať metódu HTTP, ktorú chcete vyvolať, v hlavičke požiadavky—Prepísanie metódy X-HTTP: DELETE
alebo Prepísanie metódy X-HTTP: PUT
- a potom uskutočnite POST volanie na váš zdroj.