Erweiterte Möglichkeiten mit Web API (Teil 3)
Kommentare

Benutzerdefinierte Routen
Web API gestattet die Definition von benutzerdefinierten Routen. Diese sind unter Verwendung der Methode MapHttpRoutes in der Datei global.asax innerhalb von RegisterRoutes zu

Benutzerdefinierte Routen

Web API gestattet die Definition von benutzerdefinierten Routen. Diese sind unter Verwendung der Methode MapHttpRoutes in der Datei global.asax innerhalb von RegisterRoutes zu definieren. In Listing 6 wird zum Beispiel festgelegt, dass die Methoden des in den vorangegangenen Abschnitten besprochenen BuchungenController über api/Hotels/{hotelId}/Buchungen/{id} erreichbar sind. Das schließt die Verwendung der Standardroute jedoch nicht aus. Bei {hotelId} handelt es sich hierbei um einen Platzhalter für einen Wert, der an einen gleichnamigen Übergabeparameter der einzelnen Methoden übergeben wird. {id} stellt ebenfalls einen solchen Platzhalter dar. Im Gegensatz zu {hotelId} ist er, wie im Parameter defaults angegeben, optional.

Listing 6
public static void RegisterRoutes(RouteCollection routes)
{
   [...] 
    routes.MapHttpRoute(
        name: "BuchungenByHotelRoute",
        routeTemplate: "api/Hotels/{hotelId}/Buchungen/{id}",
        defaults: new { controller = "Buchungen", id = RouteParameter.Optional }
    );
   [...]
 }  
Benutzerdefinierte Formate unterstützen

Neben JSON und XML können weitere Formate unterstützt werden, indem eine benutzerdefinierte Subklasse von MediaTypeFormatter bereitgestellt wird. Ein Beispiel dafür stellt der FlatFileFormatter in Listing 7 dar. Er bietet die Möglichkeit, eine List als CSV-Datei zu serialieren sowie Daten, die in diesem Format vorliegen, wieder als List zu deserialisieren. Im Konstruktor wird der zu verwendende Mime Type auf text/csv festgelegt. Das veranlasst Web API dazu, den FlatFileFormatter dann in Erwägung zu ziehen, wenn mit Daten dieses Mime Types gearbeitet werden soll. Durch weitere analoge Aufrufe könnten mit dem vorliegenden FlatFileFormatter auch weitere Mime Types assoziiert werden.

Die überschriebenen Methoden CanReadType und CanWriteType zeigen an, dass der FlatFileFormatter lediglich Objekte des Typs List (de)serialisieren kann; die Methoden OnWriteStream und OnReadStream legen die Logik für das Serialisieren bzw. Deserialisieren fest.

Listing 7
public class FlatFileFormatter : BufferedMediaTypeFormatter
{
    public FlatFileFormatter()
    {
        this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/csv"));
    }
        
    protected override bool CanReadType(Type type)
    {
        return type == typeof(List);
            
    }
 
    protected override bool CanWriteType(Type type)
    {
        return type == typeof(List);
    }
 
    protected override void OnWriteToStream(Type type, object value, Stream stream, HttpContentHeaders contentHeaders, FormatterContext formatterContext, System.Net.TransportContext transportContext)
    {
        var hotels = (IEnumerable)value;
        if (hotels == null) return;
 
        StreamWriter w = new StreamWriter(stream);
        foreach (Hotel h in hotels)
        {
            w.WriteLine(h.HotelId + "," + h.Bezeichnung + "," + h.Sterne);
        }
        w.Flush();
    }
 
    protected override object OnReadFromStream(Type type, Stream stream, HttpContentHeaders contentHeaders, FormatterContext formatterContext)
    {
        var hotels = new List();
        StreamReader r = new StreamReader(stream);
 
        string line;
        while( (line = r.ReadLine()) != null) {
            if (line.Trim() == "") continue;
            var cols = line.Split(',');
            var hotel = new Hotel
            {
                HotelId = Convert.ToInt32(cols[0]),
                Bezeichnung = cols[1],
                Sterne = Convert.ToInt32(cols[2])
            };
            hotels.Add(hotel);
        }
 
        return hotels;
    }
}  

Damit Web API einen benutzerdefinierten MediaTypeFormatter verwenden kann, ist der Entwickler angehalten, ihn zu registrieren. Dazu bietet sich die Methode Application_Start innerhalb der Datei Global.asax an, da diese Methode beim Hochfahren einer Webanwendung angestoßen wird. Listing 8 zeigt den hierfür benötigten Aufruf.

Listing 8
 [...]
GlobalConfiguration.Configuration.Formatters.Add(new FlatFileFormatter());
[...]  

Um einen Formatter in Aktion zu erleben, kann eine Servicemethode direkt mittels Fiddler aufgerufen werden. Abbildung 1 zeigt einen solchen Aufruf und eine dazu passende Antwort in Fiddler [2]. Dabei ist zu beachten, dass das gewünschte Antwortformat bei der Anfrage im Kopfzeileneintrag Accept angegeben wurde.

Abb. 1: Mittels Fiddler Informationen im CSV-Format anfordern
Abb. 1: Mittels Fiddler Informationen im CSV-Format anfordern

Das erwartet Sie auf den kommenden Seiten:

  • Formatter mit HttpClient verwenden
  • Querschnittsfunktionen mit Message Handler
  • Handler mit HttpClient
  • Services mit Self Hosting
  • SSL für Web API ohne IIS
  • Fazit
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -