以下是基於令牌的安全RESTful API的文章。根據您的站點ID和IP地址生成的加密令牌隨請求調用一起發送; 然後,此令牌將用於進行身份驗證,以在您的應用程序中使用RESTful服務。請按照以下演示進行參考。
下載腳本 現場演示
本教程包含三個文件夾,名爲restful, js和css, 帶有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 = md5(SITE_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.com到xyz.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-方法“ PUT,GET,POST,DELETE,OPTIONS ”
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)。ready(function()
{
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 = JSON。stringify({
“ 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>
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(“連接錯誤”);
}
};
}