Drupal Services

Tijdens het ontwikkelen van Drupal websites lopen we wel eens tegen specifieke problemen aan. Deze artikelen geven de opgedane ervaringen weer, zodat andere ontwikkelaars of geavanceerde gebruikers van Drupal daar eventueel hun voordeel mee kunnen doen.

De afgelopen tijd ben ik bezig geweest met het instellen van Drupal webservices m.b.v. de services module. Ook na het lezen van de documentatie zijn sommige dingen niet meteen duidelijk. Na wat rond-'googlen' kwam ik hier terecht.

Vrij vertaald:

  • Benader webservices altijd als een ingelogde gebruiker
  • Creëer een speciale rol voor services, bijvoorbeeld 'services'.
  • Creëer speciale gebruikers met deze rol voor services, bijvoorbeeld 'service-gebruiker'.
  • Geef deze rol zo min mogelijk rechten (net genoeg om de services te kunnen gebruiken).
  • Om nu met deze gebruiker te verbinden met de webservice moet je de volgende stappen doorlopen:
    1. Benader de 'system.connect' service. Deze service geeft je een 'sessid' (sessie id).
    2. Benader de 'user.login' service. Geef de voorgaande 'sessid' mee als parameter en tevens de gebruikersnaam (in ons geval 'service-gebruiker') en het wachtwoord. Dit geeft je je user id terug (UID).

Je bent nu ingelogd als gebruiker. Geef telkens de 'sessid' mee met de volgende service aanvragen.

Een voorbeeld:

  • Installeer de services module en schakel deze in.
  • Ga naar Structuur -> Services -> Toevoegen en maak een nieuwe server aan.
    • Geef een naam voor de 'endpoint', het type server ('REST').
    • Zet 'Session authentication' aan en maak een pad aan waar de services benaderd kunnen worden (bijvoorbeeld 'services').
    • Opslaan.
  • Je komt nu in het overzicht van alle servers die gedefinieerd zijn.
  • Ga naar 'Edit resources' , klik op het driehoekje voor 'system' en zet 'connect' aan.
  • Doe dit ook met 'user', waar je 'login' en 'logout' aanzet.
  • Vervolgens ga je naar het tabje 'Server' boven aan het overzicht, waar je 'application/x-www-form-urlencoded' aanzet in de lijst met parsers.

In principe staat nu alles goed. Je kan de Firefox Poster add-on (of vergelijkbare plugins voor andere browsers) gebruiken om de service te testen:

  • Geef de URL op: http://www.example.com/services/user/login (als 'services' het pad naar het endpoint is dat eerder werd ingevoerd).
  • Bij 'Content Type' vul je 'application/x-www-form-urlencoded' in.
  • Ga naar het parameters tabje en maak een sessid parameter aan waar je de zojuist verkregen sessid invoerd.
  • Maak ook een parameter 'username' aan met een gebruikersnaam (bijvoorbeeld 'services-gebruiker').
  • Maak een 'password' parameter aan met het goede wachtwoord.
  • Ga naar het tabje 'Content to Send' en klik op 'Body from Parameters'. Dit zet de opgegeven parameters om in een URL encoded string die in de POST header wordt meegegeven.
  • Klik 'POST' en wacht op de response. Als het goed is krijg je nu le gebruikersgegevens en een sessid te zien.
  • Afhankelijk van wat je hebt aangegeven bij 'response formatters' onder de 'Server' tab, krijg je je response terug geformatteerd als XML, JSON, YAML etc.
  • Gebruik de verkregen session id in ieder request, zodat de server weet dat je bent ingelogd.