原因:url中包含空格
背景:做项目对接时,用的是get请求,然后输入的参数中有空格就会报这个错误
解决方法:
1,url中包含空格,使用urlencode去掉空格。这是在网上找的,但是不适合我的
*****************************************************************
//GBK
//echo urlencode("中文-_. ")."\n"; //%D6%D0%CE%C4-_.+
//echo urldecode("%D6%D0%CE%C4-_. ")."\n"; //中文-_.
//echo rawurlencode("中文-_. ")."\n"; //%D6%D0%CE%C4-_.%20
//echo rawurldecode("%D6%D0%CE%C4-_. ")."\n"; //中文-_.
//
//UTF-8
//echo urlencode("中文-_. ")."\n"; //%E4%B8%AD%E6%96%87-_.+
//echo urldecode("%E4%B8%AD%E6%96%87-_. %E4%B8%AD%E6%96%87")."\n";//中文-_. 中文
//echo rawurlencode("中文-_. ")."\n";//%E4%B8%AD%E6%96%87-_.%20
//echo rawurldecode("%E4%B8%AD%E6%96%87-_.%20%E4%B8%AD%E6%96%87-_.%20")."\n"; //中文-_. 中文-_.
2,使用get请求时,将所有的值放在数组中,而不是拼接url
我的get请求是把接受的参数拼接,参数值有空格时,就会报错,因此使用了另一种方法
这是拼接url,
$url = "https://baidu.com/api/mami/NursingHandler.ashx?act=GETBABYRECORDINFONEW&babyId=".$data['babyid']."&custId=".$custId."&Code=".$data['code'];
$list = CurlHelper::getInstance()->curl_get_https($url);
curl_get_https方法:
function curl_get_https($url)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 跳过检查
$tmpInfo = curl_exec($curl);
curl_close($curl);
return $tmpInfo; //返回json对象
}
public function actionEvaluate(){
$post = \Yii::$app->request->post();
$custId = CurlHelper::getInstance()->getErpHsId(\Yii::$app->mall->id);
$user_id =CurlHelper::getInstance()->getErpUserId(\Yii::$app->user->id);
$data['act'] ='EVALUATE';
$data['custId'] =$custId;
$data['userid'] =$user_id;
$data['marketType'] = $post['markType'];
$data['projectid'] = $post['projectid'];
$data['content'] = $post['content'];
$data['star'] = $post['star'];
$gen ="https://mm.hxqt.cn/api/mami/CustomerHandler.ashx";
$url = $gen . "?" . http_build_query($data);
$list = CurlHelper::getInstance()->httpGet($url);
return [
'code' => ApiCode::CODE_SUCCESS,
'data' =>[
'list'=>$list,
]
];
}
httpGet的方法:
public function httpGet($url, $param = array(), $headers = array())
{
try {
$url = $this->appendParams($url, $param);
$client = $this->getClient($headers);
$response = $client->get($url);
$body = $response->getBody();
} catch (ClientException $e) {
$body = $e->getResponse()->getBody();
}
if (!$body) {
throw new \Exception('请求没有有效的返回');
}
$res = json_decode($body->getContents(), true);
if (!$res) {
throw new \Exception('请求返回值为空');
}
return $res;
}
private function appendParams($url, $params = [])
{
if (!is_array($params)) {
return $url;
}
if (!count($params)) {
return $url;
}
$url = trim($url, '?');
$url = trim($url, '&');
$queryString = $this->paramsToQueryString($params);
if (mb_stripos($url, '?')) {
return $url . '&' . $queryString;
} else {
return $url . '?' . $queryString;
}
}
public function getClient($headers = array())
{
return new Client([
'verify' => false,
'headers' => $headers
]);
}