使用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“連接錯誤”); 

}; 
}


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