testCurl.php
<?php
/*
* 学习笔记
1,Coentent-Type仅在取值为application/x-www-data-urlencoded和multipart/form-data两种情况下,PHP才会将http请求数据包中相应的数据填入全局变量$_POST
2,PHP不能识别的Content-Type类型的时候,会将http请求包中相应的数据填入变量$HTTP_RAW_POST_DATA
3, 只有Coentent-Type为multipart/form-data的时候,PHP不会将http请求数据包中的相应数据填入php://input,否则其它情况都会。填入的长度,由Coentent-Length指定。
4,只有Content-Type为application/x-www-data-urlencoded时,php://input数据才跟$_POST数据相一致。
5,php://input数据总是跟$HTTP_RAW_POST_DATA相同,但是php://input比$HTTP_RAW_POST_DATA更凑效,且不需要特殊设置php.ini
6,PHP会将PATH字段的query_path部分,填入全局变量$_GET。通常情况下,GET方法提交的http请求,body为空。
7,自定义头参数及获取:
7-1 自定义的参数,$_SERVER中会自动拼接上HTTP_前缀转化为大写跟下划线。header头里的参数如果有下划线nginx会收不到;
7-2 自定义带下划线的参数.如果使用nginx,header头里的参数如果有下划线(如:client_secret),使用$_SERVER接收不到,需配置nginx.conf,在里面添加 underscores_in_headers on;
*/
$url = "https://test.com/curl/getCurl.php";
$jsonArr = array('accountid' => '34', 'option' => 'chat_index');
$jsonStr = json_encode($jsonArr);
//设置了Content-Type: application/json,传参要转化为JSON,否则后台接收不到数据
//自定义的参数,$_SERVER中会自动拼接上HTTP_前缀转化为大写跟下划线。header头里的参数如果有下划线nginx会收不到;
$headerData = array(
"Content-Type: application/json",//file_get_contents('php://input')可读取application/x-www-form-urlencoded和application/json等请求类型,但无法读取Content-Type不为multipart/form-data的数据
"Content-Length: " . strlen($jsonStr) . "",
"Accept: application/json",
"private_token:tokenaaaaaaaaaa1232131",
"token_id:5K8264ILTKCH16CQ2502SI8ZNMTM67VS",//自定义带下划线的参数.如果使用nginx,header头里的参数如果有下划线(如:client_secret),使用$_SERVER接收不到,需配置nginx.conf,在里面添加 underscores_in_headers on;
"client-id:5K8264ILTKCH16CQ2502SI8ZNMTM67VS",//自定义参数
"client-secret:C380BEC2BFD727A4B6845133519F3AD6"//自定义参数
);
$data = curlRequest($url,$jsonStr,$headerData);
var_dump($data);
function curlRequest($url,$data=null,$header=null){
//初始化浏览器
$ch = curl_init();
//设置浏览器,把参数url传到浏览器的设置当中
curl_setopt($ch, CURLOPT_URL, $url);
//以字符串形式返回到浏览器当中
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//禁止https协议验证域名,0就是禁止验证域名且兼容php5.6
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
//禁止https协议验证ssl安全认证证书
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//判断data是否有数据,如果有data数据传入那么就把curl的请求方式设置为POST请求方式
if ( !empty($data) ) {
//设置POST请求方式
curl_setopt($ch, CURLOPT_POST, true);
//设置POST的数据包
@curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
//设置header头
if ( !empty($header) ) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
}
//让curl发起请求
$str = curl_exec($ch);
//关闭curl浏览器
curl_close($ch);
//把请求回来的数据返回
return $str;
}
getCurl.php
<?php
/** * 获取自定义的header数据 */
//在PHP中所有的header中的自定义信息都会被加上HTTP_的开头,在获取的时候参数名称无论大小写全部转换成大写!
function get_all_headers(){
// 忽略获取的header数据
$ignore = array('host','accept','content-length','content-type','connection');
$headers = array();
foreach($_SERVER as $key=>$value){
if(substr($key, 0, 5) === 'HTTP_'){
$key = substr($key, 5);
$key = str_replace('_', ' ', $key);
$key = str_replace(' ', '-', $key);
$key = strtolower($key);
if(!in_array($key, $ignore)){
$headers[$key] = $value;
}
}
}
return $headers;
}
$data = file_get_contents('php://input');
$headers = get_all_headers();
file_put_contents('curl.txt', print_r($_SERVER,true), FILE_APPEND);
echo $data;
exit;
?>
curl.txt日志文件如下:
Array
(
[private-token] => tokenaaaaaaaaaa1232131
[token-id] => 5K8264ILTKCH16CQ2502SI8ZNMTM67VS
[client-id] => 5K8264ILTKCH16CQ2502SI8ZNMTM67VS
[client-secret] => C380BEC2BFD727A4B6845133519F3AD6
)