如果你现在正使用iphone、android以及Web等多种平台工作,请看一下这篇文章,它会告诉你如何使用PHP创建RESTful API。Representational state transfer (REST) 是一个用于向不同应用分发数据的软件系统。Web服务系统会以JSON或者XML方式响应状态码。
数据库
数据库表users包含了user_id, user_fullname, user_email, user_password 和 user_status字段,十分简单。
1
|
CREATE
TABLE
IF
NOT
EXISTS `users`
|
2
|
(
|
3
|
`user_id`
int
(11)
NOT
NULL
AUTO_INCREMENT,
|
4
|
`user_fullname`
varchar
(25)
NOT
NULL
,
|
5
|
`user_email`
varchar
(50)
NOT
NULL
,
|
6
|
`user_password`
varchar
(50)
NOT
NULL
,
|
7
|
`user_status` tinyint(1)
NOT
NULL
DEFAULT
'0'
,
|
8
|
PRIMARY
KEY
(`user_id`)
|
9
|
) ENGINE=InnoDB
DEFAULT
CHARSET=latin1 AUTO_INCREMENT=1 ;
|
Rest API类:api.php
代码十分简单,你需要修改数据库配置信息,如数据库名、数据库账户以及密码。
1
|
require_once
(
"Rest.inc.php"
);
|
2
|
3
|
class
API
extends
REST
|
4
|
{
|
5
|
public
$data
=
""
;
|
6
|
const
DB_SERVER =
"localhost"
;
|
7
|
const
DB_USER =
"Database_Username"
;
|
8
|
const
DB_PASSWORD =
"Database_Password"
;
|
9
|
const
DB =
"Database_Name"
;
|
10
|
11
|
private
$db
= NULL;
|
12
|
13
|
public
function
__construct()
|
14
|
{
|
15
|
parent::__construct();
// Init parent contructor
|
16
|
$this
->dbConnect();
// Initiate Database connection
|
17
|
}
|
18
|
19
|
//Database connection
|
20
|
private
function
dbConnect()
|
21
|
{
|
22
|
$this
->db = mysql_connect(self::DB_SERVER,self::DB_USER,self::DB_PASSWORD);
|
23
|
if
(
$this
->db)
|
24
|
mysql_select_db(self::DB,
$this
->db);
|
25
|
}
|
26
|
27
|
//Public method for access api.
|
28
|
//This method dynmically call the method based on the query string
|
29
|
public
function
processApi()
|
30
|
{
|
31
|
$func
=
strtolower
(trim(
str_replace
(
"/"
,
""
,
$_REQUEST
[
'rquest'
])));
|
32
|
if
((int)method_exists(
$this
,
$func
) > 0)
|
33
|
$this
->
$func
();
|
34
|
else
|
35
|
$this
->response(
''
,404);
|
36
|
// If the method not exist with in this class, response would be "Page not found".
|
37
|
}
|
38
|
39
|
private
function
login()
|
40
|
{
|
41
|
..............
|
42
|
}
|
43
|
44
|
private
function
users()
|
45
|
{
|
46
|
..............
|
47
|
}
|
48
|
49
|
private
function
deleteUser()
|
50
|
{
|
51
|
.............
|
52
|
}
|
53
|
54
|
//Encode array into JSON
|
55
|
private
function
json(
$data
)
|
56
|
{
|
57
|
if
(
is_array
(
$data
)){
|
58
|
return
json_encode(
$data
);
|
59
|
}
|
60
|
}
|
61
|
}
|
62
|
63
|
// Initiiate Library
|
64
|
$api
=
new
API;
|
65
|
$api
->processApi();
|
提交登陆
通过访问REST API地址http://localhost/rest/login/ 显示从users表中查询出的用户数据。Restful API 的登录状态是根据状态码工作的。如果状态码为200,则登陆成功;否则状态码为204,会显示失败信息。更多的状态码信息请查看示例文件中的Rest.inc.php。
1
|
private
function
login()
|
2
|
{
|
3
|
// Cross validation if the request method is POST else it will return "Not Acceptable" status
|
4
|
if
(
$this
->get_request_method() !=
"POST"
)
|
5
|
{
|
6
|
$this
->response(
''
,406);
|
7
|
}
|
8
|
9
|
$email
=
$this
->_request[
'email'
];
|
10
|
$password
=
$this
->_request[
'pwd'
];
|
11
|
12
|
// Input validations
|
13
|
if
(!
empty
(
$email
)
and
!
empty
(
$password
))
|
14
|
{
|
15
|
if
(filter_var(
$email
, FILTER_VALIDATE_EMAIL)){
|
16
|
$sql
= mysql_query(
"SELECT user_id, user_fullname, user_email FROM users WHERE user_email = '$email' AND user_password = '"
.md5(
$password
).
"' LIMIT 1"
,
$this
->db);
|
17
|
if
(mysql_num_rows(
$sql
) > 0){
|
18
|
$result
= mysql_fetch_array(
$sql
,MYSQL_ASSOC);
|
19
|
20
|
// If success everythig is good send header as "OK" and user details
|
21
|
$this
->response(
$this
->json(
$result
), 200);
|
22
|
}
|
23
|
$this
->response(
''
, 204);
// If no records "No Content" status
|
24
|
}
|
25
|
}
|
26
|
27
|
// If invalid inputs "Bad Request" status message and reason
|
28
|
$error
=
array
(
'status'
=>
"Failed"
,
"msg"
=>
"Invalid Email address or Password"
);
|
29
|
$this
->response(
$this
->json(
$error
), 400);
|
30
|
}
|
获取用户信息
通过访问REST API 地址http://localhost/rest/users/ 获取用户的信息。
1
|
private
function
users()
|
2
|
{
|
3
|
// Cross validation if the request method is GET else it will return "Not Acceptable" status
|
4
|
if
(
$this
->get_request_method() !=
"GET"
)
|
5
|
{
|
6
|
$this
->response(
''
,406);
|
7
|
}
|
8
|
$sql
= mysql_query(
"SELECT user_id, user_fullname, user_email FROM users WHERE user_status = 1"
,
$this
->db);
|
9
|
if
(mysql_num_rows(
$sql
) > 0)
|
10
|
{
|
11
|
$result
=
array
();
|
12
|
while
(
$rlt
= mysql_fetch_array(
$sql
,MYSQL_ASSOC))
|
13
|
{
|
14
|
$result
[] =
$rlt
;
|
15
|
}
|
16
|
// If success everythig is good send header as "OK" and return list of users in JSON format
|
17
|
$this
->response(
$this
->json(
$result
), 200);
|
18
|
}
|
19
|
$this
->response(
''
,204);
// If no records "No Content" status
|
20
|
}
|
删除用户信息
根据user_id删除特定用户的信息,只需要访问REST API地址http://localhost/rest/deleteUser/
1
|
private
function
deleteUser()
|
2
|
{
|
3
|
4
|
if
(
$this
->get_request_method() !=
"DELETE"
){
|
5
|
$this
->response(
''
,406);
|
6
|
}
|
7
|
$id
= (int)
$this
->_request[
'id'
];
|
8
|
if
(
$id
> 0)
|
9
|
{
|
10
|
mysql_query(
"DELETE FROM users WHERE user_id = $id"
);
|
11
|
$success
=
array
(
'status'
=>
"Success"
,
"msg"
=>
"Successfully one record deleted."
);
|
12
|
$this
->response(
$this
->json(
$success
),200);
|
13
|
}
|
14
|
else
|
15
|
{
|
16
|
$this
->response(
''
,204);
// If no records "No Content" status
|
17
|
}
|
18
|
}
|
Chrome拓展
测试PHP restful API 响应的一个chrome的插件为 Advanced REST client Application
.htaccess code
使用.htaccess使URL更加友好。在demo示例中修改htaccess.txt to .htaccess。
1
|
<
IfModule
mod_rewrite.c>
|
2
|
RewriteEngine On
|
3
|
RewriteCond %{REQUEST_FILENAME} !-d
|
4
|
RewriteCond %{REQUEST_FILENAME} !-s
|
5
|
RewriteRule ^(.*)$ api.php?rquest=$1 [QSA,NC,L]
|
6
|
7
|
RewriteCond %{REQUEST_FILENAME} -d
|
8
|
RewriteRule ^(.*)$ api.php [QSA,NC,L]
|
9
|
10
|
RewriteCond %{REQUEST_FILENAME} -s
|
11
|
RewriteRule ^(.*)$ api.php [QSA,NC,L]
|
12
|
</
IfModule
>
|
Demo示例下载:
PHP示例源码:REST API示例(104)原文出自: http://www.9lessons.info/2012/05/create-restful-services-api-in-php.html
本文由PHP爱好者原创翻译!转载请注明链接!