使用Slim PHP Framework创建基于令牌的RESTful服务

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


使用Slim PHP Framework创建基于令牌的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格式。

<script src =“ http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js ”> </ script> 
<script src =“ js / ajaxGetPost.js ”> </ script> 
<script>
$(document)。readyfunction()


var base_url =“ http://www.yourwebsite.com/project_name/ ”; 
var url,encodedata; 
$(“#update”)。focus(); 

/ *加载更新* /
url = base_url + ' api / updates '; 
ajax_data(' GET ',url,function(data)

$。 }); / *插入更新* / $('body')。on(“click”,'。stpostbutton







',function()

var  update = $('#update')。val(); 
encode = JSONstringify({ 
        “ user_update ”:update,
        “ user_id ”:$(' user_id ')。val()
        }); 
url = base_url +' api / updates '; 
if(update.length> 0)

post_ajax_data(url,encode,function(data)

$。each(data.updates,function(i,data)

var html =“ <div class ='stbody'id ='stbody ““'> <div class ='stimg'> <img src ='” + data.profile_pic + “'class ='stprofileimg'/> </ div> <div class ='sttext'> <strong>” + data.name + “</ strong>” + data.user_update + “<span id ='” + data.update_id + “'class ='stdelete'> 删除</ span> </ div> </ div> ”; 
$(“#mainContent”)。prepend(html); 
$('#update')。val('')。focus(); 
}); 
}); 


}; 

/ *删除更新* /
$(身体' )。on(“click”,“。stdelete ”,function()
{
var ID = $(this).attr(“id”); 
url = base_url +' api / updates / delete / '+ ID; 
ajax_data( ' DELETE ',URL,功能(数据)

$( “ #stbody ” + ID)。淡出“慢”); 
}); 
}); 

}); 
</ SCRIPT>


使用Slim PHP Framework创建基于令牌的RESTful服务



HTML代码
包含HTML代码。$(“body”)。on('click','。stpostbutton',function(){} - stpostbutton是POST按钮的ID名称。使用jquery stringify将输入数据转换为JSON格式。

<div> 
<textarea id =“ update ”class =“ stupdatebox ”> </ textarea> 
<input type =“ hidden ”id =“ user_id ”value =“ 用户会话值”> 
<input type =“ submit ”value =“ POST “class =” stpostbutton “> 
</ div> <div id =” mainContent “> </ div>




ajaxGetPost.js
Jquery Post,获取和删除Ajax函数。

// POST Ajax
函数post_ajax_data(url,encodedata,success)

$。ajax({ 
type:“ POST ”,
url:url
data:encodedata
dataType:“ json ”,
restful:true
contentType:' application / json ',
cache:false
timeout:20000
async:true,
beforeSend:function (data){},
success:function(data){ 
success.call(this,data); 
},
error:function(data){ 
alert“连接错误”); 

}; 


// GET和DELETE Ajax
函数ajax_data(type,url,success)

$。ajax({ 
type:type
url:url
dataType:“ json ”,
restful:true
cache:false
timeout:20000
async:true
beforeSend:function(data){},
success:function(data){ 
success .call(this,data); 
},
error:function(data){ 
alert“连接错误”); 

}; 
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章