够意思博客够意思博客够意思博客

EasySwoole之URL编码urlencode后无法获取参数解决方法

前言

最近查看API请求记录发现很多请求都不符合psr规范,URL参数都是编码过了,导致后台无法获取参数!

EasySwoole之URL编码urlencode后无法获取参数解决方法(图1)

http请求演示示例 http://域名/index/urlDecode?name%3Dtest&order_id%3D6027

/**
* URL编码后无法获取参数问题
* ?name%3Dtest&order_id%3D6027  ?name=test&order_id=6027
*/
public function urlDecode(){
   $ServerParams = $this->request()->getServerParams();
   //处理url参数被转码问题
   $query = $this->request()->getQueryParams();
   foreach ($query as $k => $v) {
       $key = urldecode($k);
       if (strpos($key, '=') !== false) {
           parse_str($key, $arr);
           $query[array_keys($arr)[0]] = $arr[array_keys($arr)[0]];
           unset($query[$k]);
       }
   }
   $this->writeJson(200, [$query, $this->request()->getQueryParams(),$ServerParams['query_string'], urldecode($ServerParams['query_string'])],'URL编码问题');
   return true;
}

请求结果

{
	"code": 200,
	"result": [
	{
		"name": "test",
		"order_id": "6027"
	}, 
	{
		"name=test": "",
		"order_id=6027": ""
	}, 
	"name%3Dtest&order_id%3D6027", 
	"name=test&order_id=6027"],
	"msg": "URL编码问题"
}

解决方案1

在http控制器中onRequest方法中添加以下代码

protected $param;
public function onRequest(?string $action): ?bool
{
   $query = $this->request()->getRequestParam(); //接收请求参数
   //处理url参数被转码问题
   foreach ($query as $k => $v) {
       $key = urldecode($k);
       if (strpos($key, '=') !== false) {
           parse_str($key, $arr);
           $query[array_keys($arr)[0]] = $arr[array_keys($arr)[0]];
           unset($query[$k]);
       }
   }
   $this->param = $query;
   if (!parent::onRequest($action)) {
       return false;
   };
   return true;
}

解决方案2

在vendor/easyswoole/http/src/Message/ServerRequest.php中的修改withQueryParams()方法

public function withQueryParams(array $query)
{
   // TODO: Implement withQueryParams() method.
   //处理url参数被转码问题
      foreach ($query as $k => $v) {
       $key = urldecode($k);
       if (strpos($key, '=') !== false) {
           parse_str($key, $arr);
           $query[array_keys($arr)[0]] = $arr[array_keys($arr)[0]];
           unset($query[$k]);
       }
   }
   $this->queryParams = $query;

   return $this;
}


注意:因为请求不符合psr规范,不建议在vendor/easyswoole/http/src/Message/ServerRequest.php修改


本文为够意思原创文章,转载无需和我联系,但请注明来自够意思博客blog.go1s.cn:够意思博客 » EasySwoole之URL编码urlencode后无法获取参数解决方法

加载中~