ホームページ >バックエンド開発 >PHPチュートリアル >php で実装された簡単な json rpc フレームワークの例、jsonrpc フレームワークの example_PHP チュートリアル
json rpc は、メッセージ形式として json を使用するリモート呼び出しサービスであり、さまざまなオペレーティング システムやさまざまな環境での実行を可能にするプログラムのセットです。インターネット プロシージャ コールの仕様と一連の実装。このリモート プロシージャ コールでは、送信プロトコルとして http を使用することも、その他の送信プロトコルを使用することもできます。送信されるコンテンツは、json メッセージ本体です。
以下では、PHP に基づいた RPC フレームワークのセットをコーディングします。このフレームワークには、RPC サーバーとアプリケーション クライアントが含まれます。
(1) PHPサーバー RPCserver jsonRPCServer.php
コードをコピーします コードは次のとおりです:
クラス jsonRPCServer {
/**
* いくつかのリクエストパラメータがバインドされたリクエストクラスを処理します
* @param オブジェクト $object
* @return boolean
*/
パブリック静的関数ハンドル($object) {
// rpc json リクエストかどうかを判断します
If ($_SERVER['REQUEST_METHOD'] != 'POST' || empty($_SERVER['CONTENT_TYPE'])
||$_SERVER['CONTENT_TYPE'] != 'アプリケーション/json') {
false を返す;
}
// 入力データを読み込みます
$request = json_decode(file_get_contents('php://input'),true);
//リクエストクラスのインターフェースを実行
{
をお試しください
If ($result = @call_user_func_array(array($object,$request['method']),$request['params'])) {
$response = array ( 'id'=> $request['id'],'result'=> $result,'error'=> NULL );
} else {
$response = array ( 'id'=> $request['id'], 'result'=> NULL,
'エラー' => '不明なメソッドまたは不正なパラメータ' );}
} catch (例外 $e) {
$response = array ('id' => $request['id'],'result' => NULL, 'error' =>$e->getMessage());
}
// json形式で出力
If (!empty($request['id'])) { // 通知は応答を必要としません
header('content-type: text/javascript');
echo json_encode($response);
}
true を返します;
}
}
(2) RPC クライアント、jsonRPCClient.php
コードをコピーします コードは次のとおりです:
/*
*/
クラス jsonRPCClient {
プライベート $url;
// リクエストID
プライベート $id;
プライベート $notification = false;
/**
* @param $url
* @param bool $debug
*/
パブリック関数 __construct($url,$debug = false) {
// サーバーURL
$this->url = $url;
// プロキシ
空($proxy) ? $this->proxy = '' : $this->proxy = $proxy;
// デバッグ状態
empty($debug) ? $this->debug = false : $this->debug = true;
// メッセージID
$this->id = 1;
}
/**
*
* @param boolean $notification
*/
パブリック関数 setRPCNotification($notification) {
空($notification) ? $this->notification = false : $this->notification = true;
}
/**
* @param $method
* @param $params
* @return bool
* @throws 例外
*/
パブリック関数 __call($method,$params) {
// 检验リクエスト情報
if (!is_scalar($method)) {
throw new Exception('メソッド名にスカラー値がありません');
}
if (is_array($params)) {
$params = array_values($params);
} その他 {
throw new Exception('パラメータは配列として指定する必要があります');
}
if ($this->notification) {
$currentId = NULL;
} その他 {
$currentId = $this->id;
}
// 拼装成一个リクエスト请求
$request = array( 'method' => $method, 'params' => $params,'id' => $currentId);
$request = json_encode($request);
$this->debug && $this->debug.='***** リクエスト *****'."n".$request."n".'***** リクエストの終了 * ****'."ん";
$opts = 配列 ('http' => 配列 (
「メソッド」 => 「投稿」、
'ヘッダー' => 'コンテンツタイプ: application/json',
'コンテンツ' => $リクエスト
));
// 关键几部
$context = stream_context_create($opts);
if ( $result = file_get_contents($this->url, false, $context)) {
$response = json_decode($result,true);
} その他 {
throw new Exception('.$this->url に接続できません);
}
// 出调试情報
if ($this->debug) {
echo nl2br(($this->debug));
}
// 检验応答情報
if (!$this->notification) {
// チェック
if ($response['id'] != $currentId) {
throw new Exception('間違った応答 ID (リクエスト ID: '.$currentId.'、応答 ID: '.$response['id'].')');
}
if (!is_null($response['error'])) {
throw new Exception('リクエストエラー: '.$response['error']);
}
return $response['result'];
} else {
true を返します;
}
}
}
?>
(三) 应用实例
(1)服务端server.php
复制代码代码如下:
require_once 'jsonRPCServer.php';
复制代码代码如下:
// メンバーは测试类
'member.php' が必要です;
// 服务端调用
$myExample = 新しいメンバー();
// 注入实例
jsonRPCServer::handle($myExample)
または「リクエストなし」と出力します;
?>
(2)测试类文件,member.php
复制代码代码如下:
クラスメンバー{
パブリック関数 getName(){
'こんにちは単語' を返します。 // 戻り文字串
}
}
(3)客户端 client.php
复制代码代码如下:
require_once 'jsonRPCClient.php';
$url = 'http://localhost/rpc/server.php';
$myExample = 新しい jsonRPCClient($url);
// 客户端调用
試してみてください{
$name = $myExample->getName();
$name をエコーします ;
} catch (例外 $e) {
echo nl2br($e->getMessage()).'
'."n";
}