Programavimas

Kaip įdiegti „DelegatingHandler“, skirtą „X-HTTP-Method-Override“ žiniatinklio API

Diegdami „REST Web API“ viešajame domene, kartais susidursite su problemomis, susijusiomis su HTTP veiksmažodžių palaikymu. Du iššūkiai šiuo atžvilgiu yra ribotas HTTP veiksmažodžių palaikymas senose žiniatinklio naršyklėse (t. Y. Jie palaiko tik HTTP GET ir HTTP POST) ir agresyvios užkardos, kurios blokuoja srautą, kuris nėra nei HTTP GET, nei HTTP POST. Kaip šiais atvejais jūsų programa palaikys PUT arba DELETE? Čia tiksliai gelbėja „X-HTTP-Method-Override HTTP“ antraštė.

X-HTTP-Method-Override HTTP antraštė veikia šiek tiek panašiai kaip nulaužimas. Galite pridėti antraštę su reikšme PUT arba DELETE, kai iškviečiate savo žiniatinklio API naudodami „JavaScript“ arba per „XMLHttpRequest“ objektą iš žiniatinklio naršyklės naudojant HTTP POST skambutį. Tada galite leisti perduodančiam tvarkytojui perimti HTTP metodą, kuris bus iškviečiamas, ir atlikti atitinkamus veiksmus.

Šiame straipsnyje aptarsiu, kaip mes galime naudoti perduodantį tvarkytuvą priešais užklausos ir atsakymo dujotiekį, kad pakeistume prašymą išsiųsti galiojantį pranešimą mūsų programai arba pakeistume atsakymą, kad klientui atsiųstume teisingą atsakymą.

HTTP veiksmažodžiai ir tvarkytojų delegavimas

Jei dėl jūsų kliento, žiniatinklio naršyklės ar užkardos, esančios jūsų žiniatinklio programoje, apribojimų mes privalome naudoti tik HTTP veiksmažodžius GET ir POST, turėsime įdiegti problemą, kad palaikytume PUT ir DELETE. Šis sprendimas paprastai apima X-HTTP-Method-Override HTTP antraštės pridėjimą prie užklausos, kurioje nurodomas veiksmažodis, kurį norime naudoti per HTTP POST skambutį. Be to, mūsų programoje mums reikia deleguojančio tvarkytuvo, kuris patikrina antraštę ir, jei yra, iškviečia norimą HTTP metodą.

Prieš pasinerdami į diegimą, greitai apžvelkime, kas yra deleguojantys tvarkytojai ir kodėl čia jį naudotume. Deleguojantis tvarkytuvas ir kiti pranešimų tvarkytojai vykdomi anksti užklausų apdorojimo etape. Tai yra klasės, kurios priima HTTP užklausas ir grąžina HTTP atsakymą. Tvarkytojų delegavimas yra panašus į HttpModuliai ASP.Net. Bet skirtingai HttpModuliai, perduodantys tvarkytojai gali būti susieti grandinėmis: vienas perduodantis tvarkytojas gali nurodyti kitą perduodantį tvarkytoją. Daugiau apie tvarkytojų delegavimą galite sužinoti iš mano ankstesnio straipsnio „Kaip dirbti su pranešimų tvarkytuvėmis žiniatinklio API“.

Sukurkite žiniatinklio API valdiklį

Tarkime, kad turite žiniatinklio API valdiklį, panašų į šį:

public class AuthorsController: ApiController

    {

// GAUTI: api / autoriai

public IEnumerable Get ()

        {

grąžinti naują eilutę [] {„Joydip“, „Kanjilal“};

        }

// GAUTI: api / autoriai / 1

viešoji eilutė „Get“ (int id)

        {

grąžinti „Joydip Kanjilal“;

        }

// POST api / autorius

public void Pranešimas ([FromBody] Autoriaus vertė) {}

// PUT api / author / 1

public void Put (int id, [FromBody] Author value) {}

// IŠTRINTI api / author / 1

public void Ištrinti (int id) {}

    }

Sukurkite „DelegatingHandler“, skirtą X-HTTP-Method-Override

Dabar įgyvendinkime „X-HTTP-Method-Override“ tvarkyklę. Tai yra pranešimų tvarkytuvas, todėl, kaip įprasta, jis turėtų išplėsti DeleguojantisHandler klasė.

viešoji klasė „CustomMessageHandler“: „DelegatingHandler“

    {

readonly string [] httpMethodsList = {„Ištrinti“, „GALVA“, „ĮDĖTI“};

const eilutė httpMethodOverrideheader;

apsaugotas nepaisyti užduoties „SendAsync“ („HttpRequestMessage“ užklausa, „CancellationToken cancellationToken“)

        {

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

            {               

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

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

                {                  

request.Method = naujas HttpMethod (httpMethod);

                }

            }

grąžinimo bazė.SendAsync (užklausa, cancellationToken);

        }

    }

Kodas yra savaime suprantamas. Jis tikrina, ar nėra HTTP POST, turint antraštę X-HTTP-Method-Override. Jei antraštė yra metodų sąraše, prašymo metodas yra pakeistas.

Užregistruokite „DelegatingHandler“

Kitas žingsnis - užregistruoti prižiūrėtoją. Tai galite padaryti pridėję šį naują tvarkytuvą prie „MessageHandlers“ kolekcijos „WebApiConfig“ klasėje, kaip parodyta žemiau esančiame kodo fragmente.

public static void Register („HttpConfiguration config“)

{

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

// Žiniatinklio API maršrutai

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

pavadinimas: „DefaultApi“,

„routeTemplate“: „api / {controller} / {id}“,

numatytieji parametrai: new {id = RouteParameter.Optional}

    );

}

Arba galite užregistruoti perduodantį tvarkytuvą naudodami „Application_Start“ įvykių tvarkytuvas faile Global.asax.cs, kaip parodyta žemiau.

apsaugotas negaliojantis „Application_Start“ (objekto siuntėjas, „EventArgs e“)

        {

„RegisterRoutes“ („RouteTable.Routes“);

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

        }

Tai viskas, ką turite padaryti serverio pusėje. Kliento pusėje, t. Y. Iš žiniatinklio naršyklės, turėtumėte įsitikinti, kad pridėjote nepaisymo antraštę, kaip parodyta žemiau esančiame kodo fragmente.

$ .ajax ({

URL: „// localhost: 9820 / api / Authors / 1“,

tipas: „POST“,

duomenys: JSON.stringify (authorData),

antraštės: {

„Turinio tipas“: „application / json“,

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

})

Kaip matote ankstesniame kodo fragmente, viskas, ką jums reikia padaryti, tai užklausos antraštėje nurodyti HTTP metodą, kurį norite iškviesti -„X-HTTP-Method-Override“: DELETE arba X-HTTP-metodo nepaisymas: PUT- tada paskambinkite POST į savo šaltinį.