Odczytywanie nagłówków jest standardową operacją w ASP.NET Core i jest używane od wieków. Napisałem nawet post podsumowujący wszystkie metody przekazywania parametrów: ASP.Net Core in .NET 5 – przekazywanie parametrów do akcji. W ASP.NET Core wprowadzono przydatne atrybuty do obsługi parametrów w metodach kontrolera, takich jak [FromQuery]
lub [FromHeader]
. Ale czy istnieje sposób na użycie tych atrybutów i odczytanie nagłówków jako własny obiekt? Zobaczmy.
Tak wygląda standardowa metoda kontrolera.
// POST: weatherForecast/ [HttpPost] public IActionResult Post([FromBody] WeatherForecast forecast, [FromHeader] string parentRequestId) { try { Console.WriteLine($"Got a forecast for data: {forecast.Date} with parentRequestId: {parentRequestId}!"); } catch (Exception e) { Console.WriteLine(e); return StatusCode(StatusCodes.Status500InternalServerError); } return new AcceptedResult(); }
W tym przykładzie [FromBody]
oznacza, że forecast
zostanie odwzorowana na obiekt z treści żądania, a [FromHeader]
oznacza, że parentRequestId
zostanie pobrany z nagłówka. To działa świetnie, ale jak zmapować więcej nagłówków, najlepiej jako osobny obiekt?
Spójrzmy na ten kod:
// POST: weatherForecast/multipleHeaders [HttpPost("multipleHeaders")] public IActionResult Post([FromHeader] ForecastHeaders forecastHeaders) { try { Console.WriteLine($"Got a forecast for city: {forecastHeaders.City}," + $"temperature: {forecastHeaders.TemperatureC} and" + $"description: {forecastHeaders.Description}!"); } catch (Exception e) { Console.WriteLine(e); return StatusCode(StatusCodes.Status500InternalServerError); } return new AcceptedResult(); }
AForecastHeaders
wygląda tak:
public class ForecastHeaders { [FromHeader] public string City { get; set; } [FromHeader] public int TemperatureC { get; set; } [FromHeader] public string Description { get; set; } [FromQuery]
public string Sorting { get; set; } }
Czy zauważyłeś, że użyłem [FromHeader]
zarówno w deklaracji parametrów metody kontrolera, jak i w mojej własnej klasie?
Teraz prześlijmy żądanie z Postmana.
Wynik? Czy Ciebie zdziwił tak samo jak mnie? 😀
Zadziałało!
Wszystkie nagłówki zostały poprawnie zmapowane jako obiekt. Zwróć uwagę, że sortowanie również zostało zmapowane, nawet jeśli pochodzi z parametru zapytania, a nie z nagłówka. Udowadnia to to, że możesz połączyć te dwa podejścia, jeśli w ogóle ma to sens.
Cały zamieszczony tutaj kod jest dostępny na moim GitHub – sprawdź.
Nie wiem tylko czy to błąd czy ficzer… ale mi się podoba! ❤️