1

im new to zend framework and would like to create a web portal which offers a services . The services would be used by webapplication and mobile application both. I'm using Chris Danielson's article

http://www.chrisdanielson.com/2009/09/02/creating-a-php-rest-api-using-the-zend-framework/) as the base for.

My question is am i going in the right direction .currently im accessing the services as http://www.zendrestexample.com/version .

1) I require it to use the url as http://www.zendrestexample.com/api/version

instead.

2)Do i need to use zend restserver for writing services ?

3)can i use the same service for both mobile app and the web app ?I mean any redirects problem arise?

4)Do i need to usezend rest client to consume those service ?

Pleas help me out..

4

1 回答 1

2

那么你没有使用一堆PHP文件来完成这个......所以我认为你在正确的轨道上=)。文章中的实现还可以,但是很老了……是> 4年前写的。我建议查看Zend_Soap_ServerZend_Json_ServerZend_Rest_Server。在我看来,肥皂解决方案对移动设备来说有点沉重。

只需决定实施,少做计划!


我编写了一个 Web 应用程序,后来不得不添加服务层,以便将移动应用程序接口添加到应用程序。不幸的是,这不是最初要求的一部分,所以不得不重做很多事情。

我的建议如下(如果你的 webapp 和 api 在同一个项目中):

  1. 在库或控制器助手中编写所有应用程序逻辑。因此可以在主 Web 应用程序和 API 层中重用相同的代码
  2. 在默认模块中编写您的 webapp 逻辑
  3. 在名为“api”的专用模块中编码您的 api 层
  4. phpdoc 必须完美才能让 zend 自动生成 SMD

对于使用标准 JSON-RPC 2.0 协议的 API,Android / iPhone 都有客户端使用此协议并提供自动发现(SMD 类似于 WSDL,但用于 json)。通过 GET 发送的所有请求都会导致 SMD 显示,所有其他请求都会导致处理请求。

您的 API 层使用 Zend_Json_Server 。这是一个功能示例:

<?php

// API Controller Example
class ApiController extends Zend_Controller_Action
{

    public function init()
    {
        parent::init();
        $this->getHelper('ViewRenderer')->setNoRender();
    }

    public function helloWorldAction()
    {
        $this->_handleRequest('App_Api_HelloWorld');
    }

    protected function _handleRequest($handlerClassName)
    {
        //
        $this->getHelper('ViewRenderer')->setNoRender();

        //
        $server = new Zend_Json_Server();
        $server->setClass($handlerClassName);
        if ($_SERVER['REQUEST_METHOD'] == 'GET') {
            $cfg = Zend_Registry::get('config');
            $req = $this->getRequest();
            $reqUrl = $cfg->paths->basehref . $req->getControllerName() . '/' . $req->getActionName();

            $server->setTarget($reqUrl)
                    ->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2);
            $smd = $server->getServiceMap();

            header('Content-Type: application/json');
            echo $smd;
        } else {

            //  handle request
            $server->handle();
        }
    }

}



// HANDLER Class Example

class App_Api_HelloWorld extends App_Api_ApiHandlerAbstract
{

    /**
     * says "hello world"
     * 
     * @return string
     */
    public function hello()
    {
        return 'hello world';
    }

    /**
     * says "hello $name"
     * 
     * @param string $name
     * @return string
     */
    public function hello2($name)
    {
        return "hello $name";
    }

    /**
     * 
     * @return string
     * @throws Exception
     */
    public function hello3()
    {

        throw new Zend_Json_Server_Exception('not allowed');
        return '';
    }

}

这是示例请求(我通过 id 添加了一些引导程序魔术来获取会话)

https://domain.com/api/hello-world
{
  "session_id": "4ggskr4fhe3lagf76b5tgaiu57",
  "method": "hello2",
  "params": { 
    "name" : "Alex"
  },
  "id": 123
}

查看JSON RPC 2.0 文档

我发现Google Chrome 的Advanced REST Client是开发和测试 JSON Web 服务的最佳扩展。

为了获得额外的安全性,您可以通过向抽象控制器添加几行代码甚至创建安全控制器插件来限制通过HTTP Auth的所有请求。

祝你好运。

于 2013-10-31T20:55:34.130 回答