关键词: php语言 curl函数 get post方法 http1.1协议
不用说太多,简单概括如下:
调用京东接口时,出现$response = null;
但是 生成的带有sign签名的 url地址可以在浏览器中获得接口返回的信息
爬了将近一天的坑,都没有走出来!!最终受高人指点,得到解决.
自己尝试过得解决方法:
1.别人封装的curl方法 无效
2.输出 curl_error 和 curl_errno 无效
3.输出 curl_getinfo() 无效(查无异样)
4.各种逻辑检查
5.sign签名 测试
最终结果是:
//http1.1协议中的 url 有编码格式 不可以使用空格,使用+ 替换
**
将 $url 进行如下处理处理
$url = str_replace(’ ', ‘+’, $url);
//http1.1协议中的 url 有编码格式 不可以使用空格,使用+ 替换
//将 $url 进行如下处理处理
$url = str_replace(' ', '+', $url);
//完整代码
get请求
public static function getHttps($url)
{
$urls = str_replace(' ', '+', $url);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $urls);//设置链接
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//设置SSL验证
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置是否返回信息
$data = curl_exec($ch);//接收返回信息
curl_close($ch);
return $data;
}
post 请求
public static function postHttps($postArr, $url)
{
$urls = str_replace(' ', '+', $url);
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//设置SSL验证
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //是否检测服务器的域名与证书上的是否一致
curl_setopt($ch, CURLOPT_URL, $urls);//设置链接
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置是否返回信息
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postArr);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json; charset=utf-8',
'Content-Length: ' . strlen($postArr))
);
$res = curl_exec($ch);//接收返回信息
curl_close($ch);
return $res;
}
别人封装的curl
public static function curl($url, $params = false, $ispost = 0, $https = 0)
{
$httpInfo = array();
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36');
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if ($https) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 对认证证书来源的检查
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // 从证书中检查SSL加密算法是否存在
}
if ($ispost) {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_URL, $url);
} else {
if ($params) {
if (is_array($params)) {
$params = http_build_query($params);
}
curl_setopt($ch, CURLOPT_URL, $url . '?' . $params);// 此处就是参数的列表,给你加了个?
} else {
curl_setopt($ch, CURLOPT_URL, $url);
}
}
$response = curl_exec($ch);
if ($response === FALSE) {
//echo "cURL Error: " . curl_error($ch);
return false;
}
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$httpInfo = array_merge($httpInfo, curl_getinfo($ch));
curl_close($ch);
return $response;
}
封装的没有进行处理,可以自行脑补~~~~
完美解决!!
暂时还没有进一步深究,写此文以记录成长历程,希望能够帮助到需要帮助的人!