JSON

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

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

curl发送 JSON格式POST数据的接收,以及在yii2框架中的实现原理【精细剖析】[ 2.0 版本 ] Fecshop原文地址:curl发送 JSON格式POST数据的接收,以及在yii2框架中的实现原理【精细剖析】 1.通过curl发送json格式的数据,譬如代码: ?phpfunction http_post_js

curl发送 JSON格式POST数据的接收,以及在yii2框架中的实现原理【精细剖析】 [ 2.0 版本 ]

Fecshop原文地址:curl发送 JSON格式POST数据的接收,以及在yii2框架中的实现原理【精细剖析】

1.通过curl发送json格式的数据,譬如代码:

<?php function http_post_json($url, $jsonStr) { $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonStr); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json; charset=utf-8', 'Content-Length: ' . strlen($jsonStr) ) ); $response = curl_exec($ch); //$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return $response; } $api_url = 'http://fecshop.appapi.fancyecommerce.com/44.php'; $post_data = [ 'username' => 'terry', 'password' => 'terry4321' ];

然后在接收端,使用$_POST接收,发现打印是空的

原因是,PHP默认只识别application/x-标准的数据类型,因此接收不到,只能通过

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

来接收

2.如果我们在Yii2框架内,想通过

$username = Yii::$app->request->post('username'); $password = Yii::$app->request->post('password');

这种方式获取第一部分使用curl json方式传递的post参数,我们发现是不行的,我们需要设置yii2 request component

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

然后我们通过

$username = Yii::$app->request->post('username'); $password = Yii::$app->request->post('password');

发现是可以取值的了,然后如果你打印 $_POST,会发现这里依旧没有值,这是为什么呢?

下面我们通过代码顺藤摸瓜的查一下Yii2的源代码:

1.打开 yii\web\Request 找到post()方法:

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

发现值是由 $this->getBodyParam($name, $defaultValue) 给予

然后找到这个方法,代码如下:

/** * 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. * @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])) { $this->_bodyParams = $_POST; unset($this->_bodyParams[$this->methodParam]); return $this->_bodyParams; } $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])) { $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; }

打印 $rawContentType = $this->getContentType(); 这个变量,发现他的值为:
application/json , 然后查看函数getContentType()

public function getContentType() { if (isset($_SERVER['CONTENT_TYPE'])) { return $_SERVER['CONTENT_TYPE']; } if (isset($_SERVER['HTTP_CONTENT_TYPE'])) { //fix bug https://bugs.php.net/bug.php?id=66606 return $_SERVER['HTTP_CONTENT_TYPE']; } return null; }

也就是 当我们发送json格式的curl请求, $_SERVER['CONTENT_TYPE'] 的值为 application/json

2.重新回到上面的函数 getBodyParams(),他会继续执行下面的代码:

if (isset($this->parsers[$contentType])) { $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); }

 

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

网友点评