Zend Framework 1.12中接受ajax传来的json数据-阿里云开发者社区

开发者社区> 技术小甜> 正文

Zend Framework 1.12中接受ajax传来的json数据

简介:
+关注继续查看

首先要知道我们常所说的json对象其实是一个误说,实际上指的是javascript对象。javascript语言支持按照json格式的方式创建对象。转一篇文章,说的非常完善。http://www.cnblogs.com/TomXu/archive/2012/01/11/2311956.html

因此要传递json数据,通常都是传递一串符合json格式规范的字符串而已,并且将contentType设置成"application/json",如果传递的是javascript对象(即所谓的json对象),则会把传递过去的对象转换成 key=value&key1=value1的格式。由于这种转换后,字符串就不符合json格式,因此后台的程序无法把它当做json对象来处理。

我们可以用程序来判断是否是合法的json字符串,以PHP语言,在Zend Framework框架下为例。

假设前端的javascript代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script type="text/javascript">
   $(function(){
      jsondata={"value":["w2",3]};
        $("#btnPost").click(function(){
        var options = {
            type: 'POST',
            url: "anypage",
            data: jsondata,
            success: function (result) {
              alert(result);
            },
            dataType: "html",
            contentType:"application/json"
            };
        $.ajax(options);
      });
            });
</script>

传递的是一个jsondata,这是一个javascript对象,那么再传递到后台判断是否是符合json格式。

1
2
3
4
5
6
7
$contentType $this->getRequest()->getHeader('Content-Type');
if(strstr($contentType'application/json'))
{
  $rawBody=$this->getRequest()->getRawBody();
  json_decode($rawBody);
  echo (json_last_error() == JSON_ERROR_NONE)? "it's valid json data":"Not a valid json data";
}

通过这段代码,我们点击按钮后,会弹出"Not a valid json data"对话框。它实际上传过去的字符串是value%5B%5D=w2&value%5B%5D=3,后台无法处理按json格式处理这样的数据,硬是要这样处理的话,

一种方法是去掉contentType:"application/json",使之成为默认的application/x-www-form-urlencoded,然后通过getParam的方法去获得值,比如下面的代码

echo $this->getRequest()->getParam("value")[0];

第二种方法是调用方法parse_str(),直接解析出变量值。注意:传递contentType:"application/json"这种类型的数据,通常都是采用request的getRawBody()方法获取。

1
2
3
$rawBody=$this->getRequest()->getRawBody();
parse_str($rawBody);
echo $value[0];

那这就有点偏离本文的目的:如何介绍处理json。

其实通过上面的一些铺垫,可以知道大概,首先,得传递Json字符串到后台,后台要获得这个正真的字符串后,转换成PHP自己的对象。在PHP环境中,要传递contentType:"application/json"这种类型的数据,通常都是采用request的getRawBody()方法,来获取原始的post请求的信息。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script type="text/javascript">
$(function(){
    jsondata={"value1":["w2",3],"value2":990};//假设传递的是这样的数据
    $("#btnPost").click(function(){
      var options = {
      type: 'POST',
      url: "anyAction",
      data: JSON.stringify(jsondata),
      success: function (result) {
        alert(result);
      },
      contentType:"application/json",
      dataType: "html"
    };
    $.ajax(options);
    });
});
</script>

后台代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public function anyAction()
{
  $contentType $this->getRequest()->getHeader('Content-Type');
  if(strstr($contentType'application/json'))
  {
      $rawBody=$this->getRequest()->getRawBody();
      $json=Zend_Json::decode($rawBody);//此处$json就是一个数组,可以把它再次转换成对象
      echo $json["value1"][0],$json["value1"][1],$json["value2"],"\r\n";
      $o=(object)$json;
      echo $o->value1[0],$o->value1[1],$o->value2,"\r\n";//转换成对象
  }
  $this->getHelper("layout")->disableLayout();
  $this->getHelper("viewRenderer")->setNoRender(true);
}

上述的代码,演示了json字符串传递到php后台,转换成数组,或者对象的方法。仅供参考。











本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/1310414,如需转载请自行联系原作者




版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
4023 0
深度解密阿里巴巴技术利器:数据订阅
数据实时订阅为阿里云数据传输服务提供的一种传输功能,它可以实时获取并分发RDS增量数据。数据订阅在阿里巴巴内部已经得到广泛的应用,目前线上有上万个下游应用通过它获取核心业务的实时增量数据。使用数据订阅功能,可以实现实时消息通知、OLTP->OLAP数据实时同步,ETL 及构建本地实时灾备等典型的应用
6185 0
EntityFramework 数据操作
EntityFramework 4.3 数据操作   using (TestEntities te = new TestEntities()) { //增加数据 //Table01 t01 = new Table01(); //t01.
604 0
ML之FE:基于load_mock_customer数据集(模拟客户,单个DataFrame)利用featuretools工具实现自动特征生成/特征衍生
ML之FE:基于load_mock_customer数据集(模拟客户,单个DataFrame)利用featuretools工具实现自动特征生成/特征衍生
14 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
3962 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
5698 0
+关注
6323
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载