This post was originally published on Coding Glamour.

Er komt een moment in de geschiedenis van elke contentleverancier dat er de vraag komt om je content anders te gaan presenteren. Van je ‘main’ platform naar bijvoorbeeld mobiel.
http://www.100procentjan.nl/tweakers/api1.png
Probleem: bij een website heb je één centrale server waar je database op draait, en waar je met je favoriete toolkit tegenaan kan praten. Bij een mobiele applicatie is het iets lastiger om een database van 12 GB mee te leveren. Ergo: tijd om je content beschikbaar te maken voor externe leveranciers via een API. Programma van eisen
Toen ik gevraagd werd om de API van funda te gaan bouwen om zo onze content beschikbaar te kunnen maken voor o.a. Layar kwamen we met het volgende eisenlijstje:

  • Autorisatie benodigd met een key, op IP kan niet; want er wordt vanaf talloze mobiele apparaten data opgevraagd.
  • Losse entiteiten zodat we bepaalde velden niet door hoeven te geven aan partners (bijvoorbeeld de periode dat een huis exact te koop staat).
  • Moet werken tegen onze bestaande codebase, zodat we profiteren van bestaande bugfixes.
  • Performance is kritiek, 100.000 hits per uur is de minimale capaciteit.
  • Beschikbaar als REST API via JSON en XML, en als SOAP.
Platform
We hebben ervoor gekozen om te gaan bouwen op de WCF stack, deze biedt standaard ondersteuning voor REST en SOAP, en we kunnen eenvoudig delen van onze codebase hergebruiken; alles is toch .NET.

Let's get it started
Na het aanmaken van een WCF service in Visual Studio wordt je geconfronteerd met:
  • .svc; de implementatie van je service
  • een interface; het contract van je service
  • .config; configuratie van je service
Voorbeeld van een interface / contract
Een voorbeeld interface is:

[OperationContract] // het is een Operation; iets wat je kan doen
[WebGet(UriTemplate = "/geefhuis/{id}", ResponseFormat = WebMessageFormat.Xml)] // via GET te benaderen, en geeft XML terug
LocatieFeedObject ZoekAanbod(string id);

wat globaal op het volgende neerkomt: we hebben een actie die via een GET actie benaderd kan worden en XML teruggeeft. De URL waarop deze service draait is dan:

http://www.domein.nl/naamvanje.svc/geefhuis/1234/


Het type wat we teruggeven is een ‘LocatieFeedObject’. Een contract hiervoor kan zijn:

[DataContract(Name = "LocatieFeed")] // het is Data; iets wat je kan lezen / schrijven
public class LocatieFeedObject
{
    [DataMember(Name = "Objects")]
    public List<LocatieObject> Objects { get; set; } // we hebben meerdere objecten
    [DataMember]
    public int TotaalAantalObjecten { get; set; } // en een totaal aantal objecten
}
[DataContract(Name = "Object")] // weer een DataContract
public class LocatieObject
{
    public LocatieObject() { }
    [DataMember(Name = "Adres")]
    public string Adres { get; set; } // en 1 property (adres)
}

Wat hier nog rest is de echte implementatie in code. Deze kan heel kort zijn, want het vertalen van HTTP naar Code naar XML wordt door WCF gedaan:

public LocatieFeedObject ZoekAanbod(string id)
{
    return Dao.GeefObjecten(id);
}


Et voila
Dat is de basis van onze service. We hebben een basis-API neergezet die via REST kan praten met de rest van de wereld. Morgen ga ik in op autorisatie.