Yii2 配置request组件解析 json数据

在基础版本的config目录下 web.php 或者高级版config目录下的main.php中配置

‘components‘ =>[
    ‘request‘ => [
        ‘parsers‘ => [
            ‘application/json‘ => ‘yii\web\JsonParser‘,
        ],
    ],
],

在使用Yii::$app->request->post()时

调用yii\web\Request 中的post方法   :

 public function post($name = null, $defaultValue = null)
    {
        if ($name === null) {
            return $this->getBodyParams();
        } else {

            return $this->getBodyParam($name, $defaultValue);
        }+6

调用yii\web\Request 中的getBodyParams方法,解析内容是判断request组件中有没有相关content-type类型的解析器配置,有的话通过Yii ::createObject() 根据配置创建实例,调用相关解析器实例的parse方法解析数据内容,解析的数据内容是通过file_get_contents(‘php://input‘) 获取的:

/**
     * Returns the request parameters given in the request body.
     *
     * Request parameters are determined using the parsers configured in [[parsers]] property.
     * If no parsers are configured for the current [[contentType]] it uses the PHP function `mb_parse_str()`
     * to parse the [[rawBody|request body]].
     * @return array the request parameters given in the request body.
     * @throws \yii\base\InvalidConfigException if a registered parser does not implement the [[RequestParserInterface]].
     * @see getMethod()
     * @see getBodyParam()
     * @see setBodyParams()
     */
    public function getBodyParams()
    {
        if ($this->_bodyParams === null) {
            if (isset($_POST[$this->methodParam])) {          //post提交时,存在以$this->methodParam(默认是_method 名称)命名的参数时,直接把$_POST内容赋值给$this_bodyParams,同时删除$this->methodParam内容
                $this->_bodyParams = $_POST;
                unset($this->_bodyParams[$this->methodParam]);
                return $this->_bodyParams;
            }
       //获取Content-Type   
            $rawContentType = $this->getContentType();
            if (($pos = strpos($rawContentType, ‘;‘)) !== false) {
                // e.g. application/json; charset=UTF-8
                $contentType = substr($rawContentType, 0, $pos);
            } else {
                $contentType = $rawContentType;
            }

            if (isset($this->parsers[$contentType])) {          //在request组件中存在相关$contentType类型配置时,创建该解析器,解析$this->getRawBody() 获取的内容          // $this->getRawBody() 是通过 file_get_contents(‘php://input‘)获取内容
$parser = Yii::createObject($this->parsers[$contentType]);
                if (!($parser instanceof RequestParserInterface)) {
                    throw new InvalidConfigException("The ‘$contentType‘ request parser is invalid. It must implement the yii\\web\\RequestParserInterface.");
                }
                $this->_bodyParams = $parser->parse($this->getRawBody(), $rawContentType);
            } elseif (isset($this->parsers[‘*‘])) {
                $parser = Yii::createObject($this->parsers[‘*‘]);
                if (!($parser instanceof RequestParserInterface)) {
                    throw new InvalidConfigException("The fallback request parser is invalid. It must implement the yii\\web\\RequestParserInterface.");
                }
                $this->_bodyParams = $parser->parse($this->getRawBody(), $rawContentType);
            } elseif ($this->getMethod() === ‘POST‘) {
                // PHP has already parsed the body so we have all params in $_POST
                $this->_bodyParams = $_POST;
            } else {
                $this->_bodyParams = [];
                mb_parse_str($this->getRawBody(), $this->_bodyParams);
            }
        }

        return $this->_bodyParams;
    }
yii\web\JsonParser json 解析器,是通过parse方法解析获取的json内容,主要是通过框架里面加强版的json_decode() 就是 yii\helpers\Json::decode($rawBody, $this->asArray) 把时间josn数据变为数组格式
 /**
     * 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 [];
        }
    }
时间: 2024-10-12 23:53:00

Yii2 配置request组件解析 json数据的相关文章

JSONObject 和 GSON 解析 JSON 数据详解(转)

转载:http://www.jianshu.com/p/f99de3ec0636 点此进入:从零快速构建APP系列目录导图 点此进入:UI编程系列目录导图 点此进入:四大组件系列目录导图 点此进入:数据网络和线程系列目录导图 本节例程下载地址:WillFLowJSON 一.JSON简介 我们之前已经掌握了 XML 格式数据的解析方式,那么接下来我们要去学习一下如何解析 JSON 格式的数据,在学习之前,我们先将这两者做一个简单的比较. XML与JSON的对比: JSON和XML的数据可读性基本相

IOS开发使用NSJSONSerialization、JSONKit、SBJson、TouchJson四种方式解析Json数据

概括:JSON数据解析可以使用苹果自带的NSJSONSerialization方式,也可以使用第三方框架,比如JSONKit.SBJson.TouchJSON等,框架的使用方式比较简单,但性能比ios原生方式差很多,建议使用原生方式. 1 NSJSONSerialization,IOS原生 /** *  解析JSON数据 */ -(void) analysisJSON{ // 获取URL NSURL *url = [[NSURL alloc] initWithString:@"http://lo

通过Gson解析Json数据

Json是一种数据格式,便于数据传输.存储.交换:Gson是一种组件库,可以把java对象数据转换成json数据格式. gson.jar的下载地址:http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22gson%22 一.Json数据样式 为了便于理解我们先来看看Json的数据样式: 1. 单个数据对象 { "id": 100, "body": "It is my post", "numbe

springMVC框架下JQuery传递并解析Json数据

json作为一种轻量级的数据交换格式,在前后台数据交换中占领着很重要的地位.Json的语法很简单,採用的是键值对表示形式.JSON 能够将 JavaScript 对象中表示的一组数据转换为字符串,然后就能够在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给server端程序,也能够从server端程序传递json格式的字符串给前端并由前端解释.这个字符串是符合json语法的,而json语法又是javascript语法的子集,所以javascript很easy解释

Android网络之数据解析----使用Google Gson解析Json数据

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4063452.html 联系方式:[email protected] [正文] 文章回顾: Android网络之数据解析----SAX方式解析XML数据 一.Json数据的介绍                                                             

我的Android进阶之旅------>解决Jackson、Gson解析Json数据时,Json数据中的Key为Java关键字时解析为null的问题

1.问题描述 首先,需要解析的Json数据类似于下面的格式: { ret: 0, msg: "normal return.", news: [ { id: "NEW2016062800875700", from: "腾讯新闻客户端", qqnews_download_url: "http://inews.qq.com/m?refer=openapi_for_xiaotiancai", articletype: "1&

iOS多线程与网络开发之解析json数据

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下载:http://dwz.cn/RwTjl 游戏视频预览:http://dwz.cn/RzHHd 游戏开发博客:http://dwz.cn/RzJzI 游戏源代码传送:http://dwz.cn/Nret1 A.iOS中json的基本使用 1.解析json数据 (1)json反序列化 对象{}格式

Android 解析json数据

1.JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等).这些特性使JSON成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成(网络传输速度

Java构造和解析Json数据的两种方法详解一

原文链接:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/23/3096001.html 在www.json.org上公布了很多Java下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Json数据的方法示例. 用org.son构造和解析Json数据的方法详解请参见我下一篇博文:Java构造和解析Json数据的两种方法详解二 一.介绍 JSO