方式一:cURL
$url = "localhost/test/post/service.php"; $data = array("a"=>"網"); //初始化curl資源 $curl = curl_init(); //設置請求地址 curl_setopt($curl, CURLOPT_URL, $url); //設置獲得返回的數據,如果設置為0那么執行結果如果成功的話只會輸出true,不會得到對方返回的數據 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //設置請求方式 非零數表示設置該請求為一個普通的post請求 curl_setopt($curl, CURLOPT_POST, 1 ); //設置請求超時時間 curl_setopt($curl, CURLOPT_TIMEOUT,5*60); //設置請求頭信息 請求頭是以數組形式設置 $header = array(); $header []= 'Content-Type: application/x-www-form-urlencoded; charset=utf-8';//指定請求數據類型和字符編碼
$header []= 'Authorization: Basic '.base64_encode("username:password");//如果使用http基本驗證(username表示賬號,password表示密碼,中間用一個冒號:隔開) curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
//設定為不驗證證書和host
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
//當遇到location跳轉時,直接抓取跳轉的頁面,,有時會返回301,因為服務器使用了重定向
curl_setopt($curl,CURLOPT_FOLLOWLOCATION,1);
//設置頭文件的信息作為數據流輸出 curl_setopt($curl, CURLOPT_HEADER, 1); //設置發送數據 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); /** 用php模仿出form表單發出的請求 由於form表單的數據格式都是字符串 key=value&key2=value2..的形式,所以需要使用 $data = http_build_query($data)將數組數據轉換一下。 **/ //執行請求並獲得返回的數據 $tmpInfo = curl_exec ($curl); $error = curl_error($curl);//如果該數據不是空字符串,表示請求異常,且返回異常信息 //如果提交的數據是以http_build_query轉換后的字符串,有可能POST的數據部分會超過1024字節, //發送POST請求時header部分會包含一個參數Expect:100-continue,詢問服務器是否願意接收數據,收到服務器返回的100-continue應答后再把數據POST給服務器。 //這時就會造成返回的數據中會夾雜着頭文件信息且以字符串的形式跟數據拼接在一起。就需要將頭信息與數據體分離 $sentHeaders = curl_getinfo($curl, CURLINFO_HEADER_OUT); $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE); //關閉會話 curl_close ($curl); $header = substr($tmpInfo, 0, $headerSize); $body = substr($tmpInfo, $headerSize); var_dump(json_decode($tmpInfo,true));
模仿表單請求 示例:
function curl_form($post_data,$sumbit_url) { $post_data = http_build_query($post_data);//模擬瀏覽器post請求需要將數據轉換一下,因為瀏覽器請求時 數據集不是鍵值對,而是 &key=value 這樣的一串 //初始化 $curl = curl_init(); //設置抓取的url curl_setopt($curl, CURLOPT_URL, $sumbit_url); //設置頭文件的信息作為數據流輸出 curl_setopt($curl, CURLOPT_HEADER, 1); //設置獲取的信息以文件流的形式返回,而不是直接輸出。 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //設置post方式提交 curl_setopt($curl, CURLOPT_POST, 1); //設置post數據 curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data); //執行命令 $tmpInfo = curl_exec ($curl); $error = curl_error($curl); //當PHP cURL 時,如果POST的數據部分超過了1024字節,發送POST請求時header部分會包含一個參數Expect:100-continue,詢問服務器是否願意接收數據,收到服務器返回的100-continue應答后再把數據POST給服務器。 $sentHeaders = curl_getinfo($curl, CURLINFO_HEADER_OUT); $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE); curl_close ($curl); $header = substr($tmpInfo, 0, $headerSize); $body = substr($tmpInfo, $headerSize); if($error != '')return "error:".$error; //關閉會話 return $body; }
方法二:file_get_contents()
$post_data = array("name" => "王小剛","age" => 25); //將數組進行urlencode編碼變成key=value&key=value字符串 $postdata = http_build_query($post_data); //請求參數准備
$option = array( 'http' => array( 'method' => 'POST', 'header' => array('Content-type:application/x-www-form-urlencoded',"Accept-language: en"), 'content' => $postdata, 'timeout' => 5*60 ),
"ssl" => array(//不用驗證https證書
"verify_peer" => false,
"verify_peer_name" => false
) ); //創建一個資源流上下文 $context = stream_context_create($option); $result = file_get_contents("http://localhost/potatog/post/service.php", false, $context); var_dump(json_decode($result,true));
大多數情況下 比如與別人做對接 對方都會要求是utf-8的數據格式 所以以上的請求數據需要經過轉換
//默認UTF-8編碼格式
$o="";
foreach ($data as $k=>$v)
{
$o.= "$k=".urlencode($v)."&";
}
$data=substr($o,0,-1);
這段代碼的效果雷同$data = http_build_query($data)