Courier New
Bold
18 pt

Charlie-preso




         Building a custom API
                by Charlie van de Kerkhof (primeminister)



                        CakeFest #3 July 2009
Goals
• RESTful with the correct HTTP code
• API like twitter to open up to the public in
  the near future
• Smooth integration with code for the
  website
• Return values HTML, XML and JSON
• Not necessarily the correct methods
  (POST,GET,DELETE,PUT)
What is it?
• Link sharing (like del.icio.us) with groups
  and users
• Comments on links
• Trusted group of friends

• Links are not necessarily bookmarks!
Setup
• Database
• Routes
• Model
• Controller
• Views (HTML, XML & JSON)
• Tests
Database
Models
• Baked the associations
• Basic validation in model
• AppModel: Using containable
• AppModel: Overwrite del() method for
  using ‘status’ field in tables.
AppController
• Setting up helpers and components
• Mapping request methods to actions
• Defining up HTTP response codes


• Populate POST request to $this->data
                                   Because this APP is also meant
                                   to get data from HTML forms
GET Request
           /links/view/primeminister.xml

• Controller => links, action => view
  params[‘pass’][0] = ’primeminister’
• Check nickname variable
• Find the links from this user
• Set the results and options
APP/controllers/links_controller.php
Error occurs
    f.i. nickname is not same as loggedin user


• Calls AppController::setError()
• setError() checks which request is made
  (XML, JSON, HTML)
• When HTML is requested it calls the
  Session::setFlash method
• Other requests it sets the viewVars and
  renders the error template        errcode & code:

                                    errcode: to define f.e. 1007 what is missing.
                                    For developers handy to program

                                    Code: HTTP response code
APP/controllers/links_controller.php
APP/app_controller.php
continue... APP/app_controller.php
continue... APP/app_controller.php
Views
• Created generic template files
• XML: Xml::serialize with format=>tags
• JSON with $javascript->object($record);
• When necessary create template file in
  views/{controller} folder to override
  generic template
• Put this check in
  AppController::beforeRender
APP/views/generic/xml/view.ctp
APP/views/generic/json/view.ctp
APP/views/links/xml/view.ctp
Links view (XML)
/links/view/primeminister.xml?limit=2&page=3
Error view (XML)
Routes
Controller tests
• Test made on controller actions
• Checks for view variables
• errocode & code check

• Don’t forget to check on errors!
tests/cases/controllers/links_controllers.test.php
Summarize
• Loosely map request method (POST/
  GET/...) to action

• For using in website and as API (!)
• Return response codes and Mento errors
• Easier for developer to check what error
• Rendering views based on generic template
• Tests on controller and viewVars (code)
Question (& Answers?)
Thanks!
Web:     http://www.cake-toppings.com
IRC:     primeminister
Twitter: http://twitter.com/charli3

Building custom APIs