1

サービスの OTP を配布するように設計された zend JSON ファクトリがありますが、サーバーに実際に何も返させることができません。

<?php

class Application_Model_FrogconnectOTP
{
/**
 * Generates, stores, and returns the OTP for thesupplied user
 * 
 * @param   string  $username
 * @return  string
 */
public function generate($username)
{

     $hash = "Lol";
     return $hash;
}

/**
 * Will clear the OTP for the user.
 * 
 * @param   string  $username
 * @return  int
 */
public function delete($username) 
{
    return 1;
}
/**
 * Takes the supplied username and hash and will calculate new sums and verify the supplied hash.
 * 
 * @param   string  $username
 * @param   string  $hash
 * @return  int
 * 
 */
public function validate($username, $hash) {
    return 1;
}
}
?>

そして、このクラスは、次のようなデフォルトの (ish) zend json サーバーによってロードされます。

<?php
$this->_helper->layout->disableLayout();

$server = new Zend_Json_Server();
$OTPEngine = new Application_Model_FrogconnectOTP();
$server->setClass($OTPEngine);

if ('GET' == $_SERVER['REQUEST_METHOD']) {
    // Indicate the URL endpoint, and the JSON-RPC version used:
    $server->setTarget('/frogconnect')
           ->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();

ただし、次のような json 文字列でリクエストを作成しようとすると、サーバーは 204 No Content ヘッダーで応答しますが、コンテンツを受信しません ("Lol" を期待する必要があります)。

{"method":"generate","params":{"username":"johndoe"}}

どんな助けでもいただければ幸いです

4

1 に答える 1

2

他の誰かがこの問題を抱えている場合、ここでの問題は、Web サービスに強制的に Zend MVC レイアウトを通過させようとしているように見えることです (これは、処理コードの上部にある無効化レイアウトに基づいて推測しています)。

パブリック フォルダーに JSON-RPC サーバー用のカスタム インデックス ファイルを作成することをお勧めします。

次のようにファイルを作成してみてください。

/public/api/v1.0/jsonrpc.php

<?php
// Define path to application directory
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../../../application'));

// Define application environment
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);

$application->bootstrap();

// Instantiate server, etc.
$server = new Zend_Json_Server();
$server->setClass('Application_Model_FrogconnectOTP');

if ('GET' == $_SERVER['REQUEST_METHOD']) {
    // Indicate the URL endpoint, and the JSON-RPC version used:
    $server->setTarget('/api/v1.0/jsonrpc.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();
?>

これは、zend が MVC に使用する通常のインデックス ファイル "/public/index.php" を置き換えます。

于 2013-01-23T17:41:47.950 に答える