1

JSON-RPC 公開クラスからカスタム エラーを返す適切な方法を探しています。

JSON-RPC には、エラー状態を報告するための特別な形式があります。すべてのエラーは、最低限、エラー メッセージとエラー コードを提供する必要があります。オプションで、バックトレースなどの追加データを提供できます。

エラー コードは、XML-RPC EPI プロジェクトで推奨されているものから派生しています。Zend\Json\Server は、エラー状態に基づいてコードを適切に割り当てます。アプリケーション例外の場合、コード「-32000」が使用されます。

ドキュメントのサンプル コードの除算メソッドを使用して説明します。

<?php
/**
 * Calculator - sample class to expose via JSON-RPC
 */
class Calculator
{
    /**
     * Return sum of two variables
     *
     * @param  int $x
     * @param  int $y
     * @return int
     */
    public function add($x, $y)
    {
        return $x + $y;
    }

    /**
     * Return difference of two variables
     *
     * @param  int $x
     * @param  int $y
     * @return int
     */
    public function subtract($x, $y)
    {
        return $x - $y;
    }

    /**
     * Return product of two variables
     *
     * @param  int $x
     * @param  int $y
     * @return int
     */
    public function multiply($x, $y)
    {
        return $x * $y;
    }

    /**
     * Return the division of two variables
     *
     * @param  int $x
     * @param  int $y
     * @return float
     */
    public function divide($x, $y)
    {
        if ($y == 0) {
            // Say "y must not be zero" in proper JSON-RPC error format
            // e.g. something like {"error":{"code":-32600,"message":"Invalid Request","data":null},"id":null} 
        } else {
            return $x / $y;
        }
    }
}


$server = new Zend\Json\Server\Server();
$server->setClass('Calculator');

if ('GET' == $_SERVER['REQUEST_METHOD']) {
    // Indicate the URL endpoint, and the JSON-RPC version used:
    $server->setTarget('/json-rpc.php')
    ->setEnvelope(Zend\Json\Server\Smd::ENV_JSONRPC_2);

    // Grab the SMD
    $smd = $server->getServiceMap();

    // Return the SMD to the client
    header('Content-Type: application/json');
    echo $smd;
    return;
}

$server->handle();

psはい、Google検索を試しました。

4

1 に答える 1

2

免責事項:私はまったく使用した経験がありZend\Json\Serverません:)

Server::fault()エラー応答について話している場合は、それをメソッドに関連付けることができます ( Github にもあります)。したがって、fault()が呼び出されて応答に挿入された場合、参照された推奨される XML-RPC サーバー標準に従って、エラー メッセージを含む応答が返されると思います。

ハンドラーメソッドは、実際の作業を_handle()(ソースにリンクされた) プロキシし、try/catchが (あなたの場合は) Calculator クラスへのディスパッチをカプセル化します。

フォルトは、例外メッセージと例外コードに基づいて呼び出されます。そのため、単に例外をスローし、そこに正しいメッセージ/コードを設定していると思います:

use Zend\Json\Server\Error;

class Calculator
{
    public function divide($x, $y) 
    {
        if (0 === $y) {
            throw new InvalidArgumentException(
                'Denominator must be a non-zero numerical',
                Error::ERROR_INVALID_PARAMS
            );
        }

        // Rest here
    }

    // Rest here
}

PS。ここでエラーコードも変更しました。私にとっては、-32600 (無効な要求.

于 2013-08-20T08:38:11.313 に答える