I am planning to create a restful web service (PHP).
api/user
api/user/[id]
api/ad
api/ad/[id];
etc
are "user" and "ad" actual php files? and if not how can i tell (on my php file) which one the caller is calling "user" or "ad"? any good tutorial on how to create a restful web service? Most tutorials only cover the basics of rest web services.
Apache rewrite rules may come handy. Make a rule that routes everything below
/api
to/api/index.php
, adding the remainder of the URL (e.g./ad/user
) as a parameter. Thus,http://example.com/api/ad/user
is rewritten to something likehttp://example.com/api/index.php?path=ad/user
. Your index.php script can then simply pick up$_GET['path']
and perform the appropriate action.Well, for simple services, you have a single script file (e.g. named
index.php
) as the entry point that dispatches the various paths to your functions (which may of course be in other PHP files). It is called with one of the paths you mentioned appended after the script's name. In the script, you can use$_SERVER['PATH_INFO']
to determine the that path.You could experiment with this a little by making a script with only this content in it:
If you request this script in a browser from your web server, you will see all relevant data printed in a nice list. Scroll down to the PHP Variables section to see your
PATH_INFO
.See http://php.net/manual/en/reserved.variables.server.php
EDIT2:
Additionally, restricting access methods to HTTP GET and POST makes your life easier because PHP has
$_GET
and$_POST
variables but not e.g.$_PUT
/$_DELETE
and the like. However, you could send POST requests with a special variable specifying the method so to emulate PUT, DELETE, HEAD or OPTIONS operations (e.g._method=PUT
).When supporting other methods than GET and POST, use
$_SERVER['REQUEST_METHOD']
to determine the method used and read the data sent along with the request from the special "file"php://input
(e.g. withfile_get_contents('php://input')
).EDIT:
As tdammers noted, Apache RewriteRules are useful to make your URLs pretty, in this case to hide the script's name like this (depends on your script's location, of course):
Both approaches are fine, a good sample of restful service can be found on CakePHP, in cake you got all the files everything goes through a router class.