(1) PHPサーバー RPCserver jsonRPCServer.php
コードは次のとおりです:
クラス jsonRPCServer {/**
*いくつかのリクエストパラメータがバインドされたリクエストクラスを処理しますコードをコピーします。コードは次のとおりです:
/* */// リクエスト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
* @throws 例外
*/
パブリック関数 __call($method,$params) {
// リクエスト情報を確認する
if (!is_scalar($method)) {
throw new Exception('メソッド名にスカラー値がありません');
}
if (is_array($params)) {
$params = array_values($params);
} その他 {
throw new Exception('パラメータは配列として指定する必要があります');
}
if ($this->通知) {
$currentId = NULL;
} その他 {
}
// 拼装成一个依頼请求
$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'];
} 他 {
true を返します;
}
}
}
?>
(三) 应用实例
(1)服务端server.php
代码如下:
代码如下:
(2)测试类文件,member.php
代码如下:
(3)客户端 client.php
代码如下:
$url = 'http://localhost/rpc/server.php';
$myExample = 新しい jsonRPCClient($url);
// 客户端调用
試してみてください{
$name = $myExample->getName();
$name をエコーします ;
} catch (例外 $e) {
echo nl2br($e->getMessage()).'
'."n";
}