JSON

curl发送 JSON格式POST数据的接收,以及在yii2框架中的实现原理(2)

字号+ 作者:H5之家 来源:H5之家 2018-01-24 14:00 我要评论( )

$parser 就是根据我们下面的request component配置中的 parsers中得到'yii\web\JsonParser',进而通过容器生成出来的 'request' = ['class' = 'yii\web\Request','enableCookieValidation' = false,'parsers' = ['a

$parser 就是根据我们下面的request component配置中的 parsers中得到'yii\web\JsonParser',进而通过容器生成出来的

'request' => [ 'class' => 'yii\web\Request', 'enableCookieValidation' => false, 'parsers' => [ 'application/json' => 'yii\web\JsonParser', ], ],

因此返回值就是 $parser->parse($this->getRawBody(), $rawContentType); 返回的,

3.首先我们查看传递的第一个参数是函数 $this->getRawBody(),代码如下:

public function getRawBody() { if ($this->_rawBody === null) { $this->_rawBody = file_get_contents('php://input'); } return $this->_rawBody; }

通过这个函数,回到前面我们说的,可以通过

//第一种方法 $post = $GLOBALS['HTTP_RAW_POST_DATA']; //第二种方法 $post = file_get_contents("php://input");

这两种方式获取curl json传递的json数据,yii2使用的是第二种。

然后我们打开yii\web\JsonParser

/** * Parses a HTTP request body. * @param string $rawBody the raw HTTP request body. * @param string $contentType the content type specified for the request body. * @return array parameters parsed from the request body * @throws BadRequestHttpException if the body contains invalid json and throwException is `true`. */ public function parse($rawBody, $contentType) { try { $parameters = Json::decode($rawBody, $this->asArray); return $parameters === null ? [] : $parameters; } catch (InvalidParamException $e) { if ($this->throwException) { throw new BadRequestHttpException('Invalid JSON data in request body: ' . $e->getMessage()); } return []; } }

可以看到这里是将传递的json转换成数组,然后Yii::request->post('username')就可以从返回的这个数组中取值了

总结:

1.在Yii2框架中要用封装的post() 和 get()方法, 而不要使用$_POST $_GET等方法,因为两者是不相等的。

2.Yii2做api的时候,如果是json格式传递数据,一定不要忘记在request component中加上配置:

'request' => [ 'class' => 'yii\web\Request', 'parsers' => [ 'application/json' => 'yii\web\JsonParser', ], ],

本文由 Terry 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。
可自由转载、引用,但需署名作者且注明文章出处。

Yii2 命名空间

共 2 条评论

  • xiaoshenzhen 评论于 2017-11-23 17:31

    Fecshop 全称为Fancy ECommerce Shop,是基于php Yii2框架之上开发的一款优秀的开源电商系统,
    Fecshop支持多语言,多货币,架构上支持pc,手机web,手机app,和erp对接等入口,您可以免费快速的定制和部署属于您的电商系统。

    详细参看地址:Fecshop介绍

    Fecshop 官网: ,您可以在这里提交bug,问题咨询等等。

    Fecshop 【已完成】PC Web Demo :

    Fecshop 【已完成】Mobile Web Demo(WAP):

    Fecshop 【已完成】Mobile VUE Demo(Appserver,前后端彻底分离模式):

    Fecshop 后台演示地址:加QQ群,在群公告里面有后台演示地址,账号密码等信息

    Fecshop QQ群:186604851 ,入群验证:fecshop

    Fecshop 作者QQ:2358269014

    FecShop Email:2358269014@qq.com

    Fecshop Github地址: https://github.com/fancyecommerce/yii2_fecshop

    开源协议:Fecshop 授权协议

  • pklim101 评论于 2017-11-29 23:52

    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); 这样设置就可以$_POST获取到

    共 3 条回复

    xiaoshenzhen 评论于 2017-11-30 13:00

    我测试$_POST取不到,取不到json数据,你可以贴一下你的详细完整代码说明一下你的观点

    pklim101 评论于 2017-12-11 08:51

    @xiaoshenzhen 完整代码我一下找不到了,但是大概是这样的:
    $data=array('param1'=>123,'param2'=>'abc');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));

    xiaoshenzhen 评论于 2017-12-11 12:35

    @pklim101 你和我说的不是一种类型,我这里说的是json格式的,注意看消息头:

    curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json; charset=utf-8', 'Content-Length: ' . strlen($jsonStr) ) );

  • 发表评论

    您需要登录后才可以评论。登录 | 立即注册

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • 用httpPost对JSON发送和接收的例子

      用httpPost对JSON发送和接收的例子

      2018-01-24 15:01

    • 更好更快更高效解析JSON说明[json

      更好更快更高效解析JSON说明[json

      2018-01-24 12:06

    • Lua CJSON安装和使用教程

      Lua CJSON安装和使用教程

      2018-01-24 11:10

    • JSONLINT:python的json数据验证库实例解析

      JSONLINT:python的json数据验证库实例解析

      2018-01-23 17:00

    网友点评