前面部落客寫過一篇“ASP如何調用Delphi開發的DataSnap/Restful接口服務”的文章,有網友反映不知道如何使用PHP來調用。
其實PHP調用Restful接口服務比ASP更簡單,寫一個例子說明一下。
1、通用接口函數調用檔案:testRestful.php
<?php
header("Content-Type:text/html;charset=utf-8");
?>
<?php
//數組轉換成以'/'分隔的字元串
function http_build_query_delphi($arr)
{
//$arr = array('url'=>'http://www.jb51.net','name'=>'腳本之家','str'=>'PHP教程');
$result = '';
//foreach($arr as $key=>$value){
foreach($arr as $value){
$result .= '/'.$value;
}
if (strlen($result)>0)
$result = substr($result,1); //删除第一個"/"字元
return $result;
}
/**
* [http 調用接口函數]
* @Date 2016-07-11
* @Author GeorgeHao
* @param string $url [接口位址]
* @param array $params [數組]
* @param string $method [GET\POST\DELETE\PUT]
* @param array $header [HTTP頭資訊]
* @param integer $timeout [逾時時間]
* @return [type] [接口傳回資料]
*/
function http($func, $params, $method = 'GET', $header = array(), $timeout = 5)
{
define('_SRV','http://localhost:8019/peci/rest/TServerMethods/'); //定義了一個常量,應從配置檔案中讀取
define('_KEY','91F11212729292F2136DADED3656B6CECECECD3145474855B6'); //應從配置檔案中讀取
$params["KeyNumber"] = _KEY;//增加一個Key鍵值和元素
$url = _SRV . $func;
// POST 送出方式的傳入 $set_params 必須是字元串形式
$opts = array(
CURLOPT_TIMEOUT => $timeout,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_HTTPHEADER => $header
);
/* 根據請求類型設定特定參數 */
switch (strtoupper($method)) {
case 'GET':
//通常$url=http://localhost/netpay/rest/TServerMethod1/GetXQList?xq=1&room=10110105
//$opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
$opts[CURLOPT_URL] = $url . '/' . http_build_query_delphi($params);
//Delphi生成的Restful服務接口函數調用時不是常見?x=值1&y=值2的方式,而是直接/值1/值2的方式,問号?也用/替代了。
//如:$url=http://localhost/netpay/rest/TServerMethod1/GetXQList/1/10110105
break;
case 'POST':
$params = http_build_query($params);
$opts[CURLOPT_URL] = $url;
$opts[CURLOPT_POST] = 1;
$opts[CURLOPT_POSTFIELDS] = $params;
break;
case 'DELETE':
$opts[CURLOPT_URL] = $url;
$opts[CURLOPT_HTTPHEADER] = array("X-HTTP-Method-Override: DELETE");
$opts[CURLOPT_CUSTOMREQUEST] = 'DELETE';
$opts[CURLOPT_POSTFIELDS] = $params;
break;
case 'PUT':
$opts[CURLOPT_URL] = $url;
$opts[CURLOPT_POST] = 0;
$opts[CURLOPT_CUSTOMREQUEST] = 'PUT';
$opts[CURLOPT_POSTFIELDS] = $params;
break;
default:
throw new Exception('不支援的請求方式!');
}
/* 初始化并執行curl請求 */
$ch = curl_init();
//如果網站需要安全驗證,那麼需要執行下面兩條指令,否則就不需要。
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, 'username:password');
curl_setopt_array($ch, $opts);
$data = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
return $data;
}
?>
2、測試檔案:test.php
<?php require("testRestful.php") ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Stict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-
strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang = "zh-CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
$func = "GetRoomInfo_ByRoom";
echo "調用接口方法:" . $func . "(xiaoqu_id,room,KeyNumber),結果如下:<hr>";
$params = array("xiaoqu_id" => "1", "room" => "10110105");
$result = http($func,$params);
if ($result === false)
echo "接口方法執行失敗!";
else
echo "接口方法執行成功!傳回結果為:<p>" . $result;
?>
</body>
</html>
執行結果為:
