request 获取请求参数时字段尾部的空格或者回车获取不到?
0

我请求时参数携带了回车,获取到的参数最后结尾部分的回车不见了?var_dump打印出来长度也少了4位,是什么引起的?

这是我的测试代码:
$params['app_key'] = APP_KEY;
$params['access_token'] = APP_TOKEN;
$params['timestamp'] = time();
$params['test'] = "ceshi ";
$params['sig'] = getSig($params);
var_dump($params);
echo $rs = request('http://dev.apiserver.com/v1/Orders/importOrder',$params,'POST');

生成sig

function getSig($params,$debug=true){
if(empty($params) || !is_array($params)) return;
ksort($params);
$signStr = http_build_query($params);
$signStr = APP_SECRET.'?'.$signStr.APP_SECRET;
//if($debug) echo "待加密的字符串:".$signStr."
";
return MD5($signStr);
}

http请求

function request($url, $params=null, $method='GET',$timeout= 30){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FAILONERROR, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
//https 请求
if(strlen($url) > 5 && strtolower(substr($url,0,5)) == "https" ) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}

if($method == "GET"){
    curl_setopt($ch, CURLOPT_URL, $url.'?'.http_build_query($params));
    curl_setopt($ch, CURLOPT_HTTPGET, true);
}

if($method == "POST"){
    curl_setopt($ch, CURLOPT_POST, true);
    if(is_array($params) && 0 < count($params)){
        $postBodyString = "";
        $postMultipart = true;
        foreach($params as $k => $v){
            if("@" != substr($v, 0, 1)){
                $postBodyString .= "$k=" . urlencode($v) . "&";
            }else{
                $postMultipart = true;
            }
        }
        unset($k, $v);
        if ($postMultipart){
            curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
        }else{
            curl_setopt($ch, CURLOPT_POSTFIELDS, substr($postBodyString,0,-1));
        }
    }
}

$reponse = curl_exec($ch);
curl_close($ch);
return $reponse;

}

下面是我var_dump 的结果

array(5) {
["app_key"]=>
string(32) "cd25ee6ca398668acd3549ba5f8e66fd"
["access_token"]=>
string(32) "ad44a9f8f68867e042ac8f11af24c1f5"
["timestamp"]=>
int(1539656253)
["test"]=>
string(10) "ceshi "
["sig"]=>
string(32) "b3abe160fdaae10848ca816b4a4657bf"
}
array(5) {
["app_key"]=>
string(32) "cd25ee6ca398668acd3549ba5f8e66fd"
["access_token"]=>
string(32) "ad44a9f8f68867e042ac8f11af24c1f5"
["timestamp"]=>
string(10) "1539656253"
["test"]=>
string(5) "ceshi"
["sig"]=>
string(32) "b3abe160fdaae10848ca816b4a4657bf"
}

test这个字段长度不相等?

下面是我后台的执行代码
class BaseController extends \App\Http\Controllers\Controller
{
protected $store;
protected $api_client;

public function __construct(Request $request)
{
    var_dump($request->all());exit;
    $this->initOauth($request);
    if(!$this->checkSign($request)) {
        $params = $request->all();
        unset($params['sig']);
        throw new V1Exception('sig 无效,签名错误', 40005);
    }
}
....
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2

已经找到了解决的办法 是应为 TrimStrings 这个全局中间件会自动对请求中的字符串字段进行处理,将字符串两端的空格清除导致空格或者回车消失. 只需要在Kernel中注释掉这个中间件就可以了

3个月前

编辑 app/Http/Kernel.php 文件,去掉 \App\Http\Middleware\TrimStrings::class, 中间件,或者编辑 app/Http/Middleware/TrimStrings.php 文件,在 $except 属性里面添加排除字段就可以了。

3个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!