YII2 Configuring the request component to parse JSON data

Source: Internet
Author: User
Tags yii

In the basic version of Config directory web.php or the advanced version of Config directory under the main.php configuration

' Components '    + = [' request '        = ' = ' parsers '            = ' = ' Application/json ' = > ' Yii\web\jsonparser ',        ],    ],

When using Yii:: $app->request->post ()

Call the Post method in Yii\web\request:

  Public functionPost$name=NULL,$defaultValue=NULL)    {        if($name===NULL) {            return $this-Getbodyparams (); } Else {                    return $this->getbodyparam ($name,$defaultValue); }+6

Invoking the Getbodyparams method in Yii\web\request, parsing the content is to determine whether there is a parser configuration in the Request component that does not have the relevant content-type type, and, if so, by Yii:: CreateObject () creates an instance from the configuration , the parse method that invokes the relevant parser instance parses the data content, and the parsed data is obtained through file_get_contents (' Php://input '):

/** * Returns the request parameters given in the request body.     * * Request parameters is determined using the parsers configured in [[Parsers]] property. * If no parsers is configured for the current [[ContentType]] It uses the PHP function ' mb_parse_str () ' * To parse th     e [[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 functionGetbodyparams () {if($this->_bodyparams = = =NULL) {            if(isset($_post[$this-Methodparam])) {
When the post commits, there is a parameter named $this->methodparam (the default is the _method name), the $_post content is assigned to $this_bodyparams directly, and the $this-> is deleted. Methodparam content$this->_bodyparams =$_post; unset($this->_bodyparams[$this-Methodparam]); return $this-_bodyparams; }//Get 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])) {
When there is an associated $contenttype type configuration in the request component, the parser is created to parse the content obtained by $this->getrawbody ()
$this->getrawbody () is passedfile_get_contents (' php://input ') get content
$parser= Yii::createobject ($this->parsers[$contentType]); if(! ($parserinstanceof Requestparserinterface)) {                    Throw NewInvalidconfigexception ("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(! ($parserinstanceof Requestparserinterface)) {                    Throw NewInvalidconfigexception ("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 had already parsed the body so we had all params in $_post                $this->_bodyparams =$_post; } Else {                $this->_bodyparams = []; Mb_parse_str ($this->getrawbody (),$this-_bodyparams); }        }        return $this-_bodyparams; }
The Yii\web\jsonparser JSON parser, which is the JSON content parsed by the parse method, is mainly through the Json_decode () in the framework of the Yii\helpers\json::d ecode ($rawBody, $this->asarray) Turn the time Josn data into an array format
 /** * 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 functionParse$rawBody,$contentType)    {        Try {            $parameters= Json::d ecode ($rawBody,$this-Asarray); return $parameters===NULL? [] :$parameters; } Catch(invalidparamexception$e) {            if($this-throwexception) {                Throw NewBadrequesthttpexception (' Invalid JSON data in Request body: '.$e-getMessage ()); }            return []; }    }

YII2 Configuring the request component to parse JSON data

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.