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.
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:
<?php
phpinfo();
?>
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. with file_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):
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/api/index\.php(/|$)
RewriteRule ^/api/(.*)$ /api/index.php/$1 [QSA,L]
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 like http://example.com/api/index.php?path=ad/user
. Your index.php script can then simply pick up $_GET['path']
and perform the appropriate action.
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.