Rest Web Services?

2019-03-22 08:29发布

问题:

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.

回答1:

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]


回答2:

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.



回答3:

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.



标签: php rest