【问题标题】:extjs 4 rest proxy and zend 2 restful controllerextjs 4 休息代理和 zend 2 休息控制器
【发布时间】:2013-01-20 06:33:26
【问题描述】:

我想从 EXTJS 4 rest 代理向 Zend 2 restful 控制器发布数据。 但是当我用萤火虫检查时,我发现有帖子数据,但我无法获取该数据。如何获取该帖子数据以在我的方法中使用它。 我在哪里弄错了,我无法弄清楚。 任何人都有将数据从 REST Extjs 4 代理方法发布到 Zend 的步骤?

【问题讨论】:

  • 您的 Z2 应用程序如何期望数据被格式化,ExtJS 是如何格式化它的?听起来 ExtJS 的请求是正常的,所以我最初的反应是你的 Z2 应用程序没有配置为接受 ExtJS 发送格式的请求。愿意分享一些请求的 sn-p 和 Z2 代码中的一些位,以显示您如何处理入站请求?
  • 分享(至少)你的服务器代码

标签: extjs zend-framework2 extjs-mvc


【解决方案1】:

在 PHP 中从 HTTP 请求正文加载 JSON 的标准方法是使用

$some_json = file_get_contents('php://input');
$some_object = json_decode($some_json);

我不知道 Zend2 是否有自己的方法。

【讨论】:

    【解决方案2】:

    ExtJSsortpagefilter 等参数发送到 URL,例如:http://myhost.com/?page=2&sort=myfield

    在这种情况下,您只需从RESTController Action 中截取查询参数:

    $page   = $this->params()->fromQuery('page');
    $sort   = $this->params()->fromQuery('sort');
    

    到 ZF2 REST 控制器的数据传输取决于您使用的 HTTP 方法:

    • GETPUTDELETE 接收 $id 参数;
    • POST 用于创建新记录并接收 $data 参数。

    更多信息,您可以在这里查看:

    http://framework.zend.com/manual/current/en/modules/zend.mvc.controllers.html#the-abstractrestfulcontroller

    如果您有兴趣,我正在为Sencha 开发我的REST 代理,我已经使用ExtJSSencha Touch 框架进行了测试,它支持分页、远程过滤、远程排序等。

    它是使用 Zend Framework 2 开发的,可以在同一安装中支持不同的 DB 类型。看看:

    http://apiskeleton.asaconsult.com/

    【讨论】:

      【解决方案3】:

      我也有同样的问题。现在,之前的回复不起作用的原因是 Zend Studio 10 有一个新功能,可以从一个接收参数并创建路由的可视化编辑器配置 REST 服务。这个服务设计者实际上接受了 Restful 服务的 POST 操作的主体参数,但它以某种方式忽略了从 ExtJS 发送的 JSon。更糟糕的是,如果您使用 Zend Studio 10 中的集成 GUI 测试该服务,它可以完美运行,并且生成的 JSon 与来自 ExtJS 的 100% 相同(我实际上执行了一些数据转换以达到这一点),并且它不起作用。

      真正的问题是 POST 方法中存在与 ExtJS 请求不同的“某些东西”,而不是框架本身所期望的 JSon,它从开发人员那里抽象出用于反序列化此 JSon 的代码。

      真正的问题是,Zend 服务器网关库期望 ExtJS 在 POST 正文中以不同的方式发送什么?如果这里成千上万的专家中的任何一位可以检查一下并给出正确的答案,我将不胜感激。回答这个问题的人必须拥有或下载 Zend Studio 10 的试用版,并亲自检查 ZS10 附带的 Visual Service Tool 是如何工作的。到目前为止,我发现 ExtJS4 会像这样生成它的 JSON:

      {"data":
       {"IdCurso":"0","Nombre":"NodeJS","IdEstadoCurso":"1",
        "IdTipoPeriodo":"1","CantPeriodo":"1","CantAsignatura":"1","IdPlantel":"1"}
      }
      

      用于测试服务的 Zend GUI 生成(并且服务接受)JSON,如下所示:

      {
          'data' : '{"Nombre":"NodeJS","IdEstadoCurso":"1","IdTipoPeriodo":"1","CantPeriodo":"1","CantAsignatura":"1","IdPlantel":"1","IdCurso":"0"}'
      }
      

      如您所见,数据用单引号括起来,其内容也可供 Zend Framework 毫无问题地使用。 ExtJS 使用双引号,并且不引用数据包本身的内容。

      这是一个真正有效的补丁,不是最终的解决方案,如果有人找到更好的解决方案,那就太好了。

      试试这个作为你的 add() (POST) 方法的第一条指令:

      $data = json_decode($this->getRequest()->getContent());
      

      您可能需要添加以下内容:

      $data = (array) $data;
      

      之后,继续使用 $data 变量正常编写代码,就像参数实际有效时所做的那样。

      【讨论】:

      • 这实际上是同一个问题,因为我的情况与这个相同。实际上,我正在为原始问题提供更多信息和见解,因此答案更加准确且不那么模糊。我即将找到解决方案并将其发布在这里。
      • 谢谢,我刚做了。我将编辑我的帖子,因此它有助于回答这个问题。
      猜你喜欢
      • 1970-01-01
      • 2014-04-25
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多