以下是基于令牌的安全RESTful API的文章。根据您的站点ID和IP地址生成的加密令牌随请求调用一起发送; 然后,此令牌将用于进行身份验证,以在您的应用程序中使用RESTful服务。请按照以下演示进行参考。




下载脚本     现场演示

本教程包含三个文件夹,名为restful,  jscss,  带有PHP文件。

restful
Slim // Slim Framework
---- db.php 
---- index.php // api索引文件
---- .htaccess  // url重定向文件。 
js
jquery.min.js
ajaxGetPost.js 
css
style.css
index.php


数据库设计
要构建好友更新系统,您必须创建三个表,例如用户,朋友和更新。您可以查看我以前的朋友系统教程。

用户表

用户表包含所有用户注册详细信息。 

CREATE TABLE` 用户 `(
USER_ID `INT(11)AUTO_INCREMENT
用户名 `VARCHAR(50),
密码 `VARCHAR(100),
 `VARCHAR(100),
profile_pic `VARCHAR(200),
PRIMARY KEY( `user_id`)
);


更新表

用户表包含用户状态更新详细信息。 

CREATE TABLE` 更新 `(
UPDATE_ID `INT(11)AUTO_INCREMENT
user_update `文字,
user_id_fk `INT(11),
创建 `INT(11),
知识产权 'VARCHAR(50),
PRIMARY KEY(`update_id` )
);



使用Slim PHP Framework 
使用Java和MySQL 

db.php 创建RESTful服务在php.ini文件中
尝试启用php_pdo扩展之前,您必须修改数据库配置详细信息。

<?php
session_start(); 
$ _SESSION ['uid'] ='1'; 
$ session_uid = $ _SESSION ['uid']; 
define(“ SITE_KEY ”,“yoursitekey”); 

function getDB(){
$ dbhost =“ localhost ”; 
$ dbuser =“ username ”; 
$ dbpass =“密码 ”; 
$ dbname =“ database ”; 
$ dbConnection = new PDO(“ mysql:host = $ dbhost ; dbname = $ dbname”,$ dbuser,$ dbpass); 
$ dbConnection-> setAttribute(PDO ::ERRMODE_EXCEPTION); 
return $ dbConnection; 

/ * API密钥加密* / 
function apiKey($ session_uid)

$ key = md5SITE_KEY。$ session_uid); 
return hash(' sha256 ',$ key。$ _SERVER [' REMOTE_ADDR ']); 


$ apiKey = apiKey($ session_uid); 
?>


苗条的框架


api / index.php
Slim Framework可以帮助您简化API系统的实现。

<?php
需要  ' db.php '; 
要求 ' Slim / Slim.php '; 
\ Slim \ Slim :: registerAutoloader(); 

$ app = new \ Slim \ Slim(); 

$ APP->的get( '/为userDetails', 'getUserDetails'); 
$ APP->的get( '/用户', 'getUsers'); 
$ APP->交的( '/ userUpdates', 'userUpdates'); 
$ app-> post('/ insertUpdate','insertUpdate'); 
$ APP->删除( '/更新/删除/:UPDATE_ID /:USER_ID /:apiKey', 'deleteUpdate'); 
$ APP->的get( '/用户/搜索/:查询', 'getUserSearch'); 

$ app-> run(); 

//获取http://www.yourwebsite。


..... 


功能 userUpdates()

$ =请求\苗条\苗条:: 的getInstance() - > 请求(); 
$ update = json_decode($ request-> getBody()); 
$ apiKey = $最新情况:> apiKey; 
$ sever_apiKey = apiKey($ update-> user_id); 
$ sql =“ SELECT A.user_id,A.username,A.name,A.profile_pic,B.update_id,B.user_update,B.created FROM users A,更新B WHERE A.user_id = B.user_id_fk ORDER BY B. update_id DESC “; 
try { 
if($ apiKey == $ sever_apiKey)

$ db = getDB();
$ stmt = $ db-> prepare($ sql); 
$ stmt-> execute(); 
$ updates = $ stmt-> fetchAll(PDO :: FETCH_OBJ); 
$ db = null ; 
echo ' {“updates”: '。json_encode($ updates)。' } '; 


赶上PDOException $ E){ 
回声 ' { “错误”:{ “文”: '。$ e-> getMessage()。'}}'; 



功能 getUserUpdate($ UPDATE_ID){ 
..... 
.....


(){ 
$ request = \ Slim \ Slim :: getInstance() - > request(); 
$ update =  json_decode($ request-> getBody()); 
$ apiKey = $最新情况:> apiKey; 
$ sever_apiKey = apiKey($ update-> user_id); 
$ sql =“ INSERT INTO updates(user_update,user_id_fk,created,ip)VALUES(:user_update,:user_id ,:created ,:ip  ”; 
try { 
if($ apiKey == $ sever_apiKey)

$ db = getDB(); 
$ stmt = $ db-> prepare($ sql); 
$ stmt->bindParam(“user_update”,$ update-> user_update); 
$ stmt-> bindParam(“user_id”,$ update-> user_id); 
$ time = time(); 
$ stmt-> bindParam(“created”,$ time); 
$ ip = $ _SERVER ['REMOTE_ADDR']; 
$ stmt-> bindParam(“ip”,$ ip); 
$ stmt-> execute(); 
$ update-> id = $ db-> lastInsertId(); 
$ db = null; 
$ update_id = $ update-> id; 
getUserUpdate($ update_id); 


赶上PDOException  $ E){ 
回声  “ {”getMessage()。'}}'; 



函数deleteUpdate($ UPDATE_ID,$ USER_ID,$ apiKey)

$ sever_apiKey = apiKey($ USER_ID); 
$ sql =“ DELETE FROM api_updates WHERE update_id =:update_id ”; 
try { 
if($ apiKey == $ sever_apiKey)

$ db = getDB(); 
$ stmt = $ db-> prepare($ sql); 
$ stmt-> bindParam(“update_id”,$ update_id); 
$ stmt->执行(); 
$ db = null; 
回声真实; 


赶上PDOException  $ E){ 
回声 ' {“error”:{“text”: '。$ e-> getMessage()。'}}'; 



功能  getUserUpdate($ UPDATE_ID){ 
// ...... 
// ......


// GET http://www.yourwebsite.com/api/users/search/sri
功能getUserSearch($查询) { 
// ..... 
// ....

?>


Chrome扩展
在此处下载用于测试PHP restful API响应的扩展高级REST客户端应用程序

跨域访问

跨域系统是在两个或更多个不同域之间传输信息/数据。例如。abc.comxyz.com 

.htaccess
我修改了Slim Framework默认.htaccess代码以支持跨域支持。

RewriteEngine On 

#某些主机可能要求您使用`RewriteBase`指令。
#如果需要使用`RewriteBase`指令,它应该是
包含此htaccess文件的目录#绝对物理路径。
## 
RewriteBase / 

#跨域访问
标题添加 Access-Control-Allow-Origin“*” 
标题添加 Access-Control-Allow-Headers“来源,x-requested-with,content-type” 
标题添加 Access-Control-Allow-方法“ PUTGETPOSTDELETEOPTIONS ” 

RewriteCond%{REQUEST_FILENAME }! - f 
RewriteRule ^(。*)$ index.php [QSA,L]


了解有关使用CSS的状态消息设计的更多信息

Jquery
包含JavaScript和HTML代码,使用Jquery ajax将API数据解析为HTML格式。