使用PHP发送get、post请求的几种方法(curl,header)

  •   
  • 8737
  • PHP
  • 32
  • super_dodo
  • 2016/11/08

在接口的开发中经常会遇到需要请求相关的第三方或者其他应用的接口,此处收集了几种PHP的发送get、post请求的方法。建议用curl。

方法1: 用file_get_contents 以get方式获取内容

  
$url='http://www.dodobook.net/';  
$html = file_get_contents($url);  
echo $html;  

方法2: 用fopen打开url, 以get方式获取内容

  
$fp = fopen($url, 'r');  
//返回请求流信息(数组:请求状态,阻塞,返回值是否为空,返回值http头等)  

stream_get_meta_data($fp);  

while(!feof($fp)) {  
	$result .= fgets($fp, 1024);  
}  
echo "url body: $result";  
fclose($fp);  

方法3:用file_get_contents函数,以post方式获取url

  
$data = array ('foo' => 'bar');  
//生成url-encode后的请求字符串,将数组转换为字符串  
$data = http_build_query($data);  
$opts = array (  
	'http' => array (
		'method' => 'POST',  
		'header'=> "Content-type: application/x-www-form-urlencoded\r\n" .  
		"Content-Length: " . strlen($data) . "\r\n",  
		'content' => $data
	)
);  

//生成请求的句柄文件  
$context = stream_context_create($opts);  
$html = file_get_contents('http://www.dodobook.net/api/hello/world', false, $context);  
echo $html;  

方法4:用fsockopen函数打开url,以get方式获取完整的数据,包括header和body,fsockopen需要 PHP.ini 中 allow_url_fopen 选项开启

  
function get_url($url,$cookie=false){
	$url = parse_url($url);  
	$query = $url[path]."?".$url[query];  
	echo "Query:".$query;  
	$fp = fsockopen( $url[host], $url[port]?$url[port]:80 , $errno, $errstr, 30);  
	if(!$fp){  
		return false;  
	}else{  
		$request = "GET $query HTTP/1.1\r\n";  
		$request .= "Host: $url[host]\r\n";  
		$request .= "Connection: Close\r\n";  
		if($cookie) $request.="Cookie:$cookie\n";  
		$request.="\r\n";  
		fwrite($fp,$request);  
		while()) {  
			$result .= @fgets($fp, 1024);  
		}  
		fclose($fp);  
		return $result;  
	}  
}

//获取url的html部分,去掉header  
function GetUrlHTML($url,$cookie=false){  
	$rowdata = get_url($url,$cookie);  
	if($rowdata){
		$body= stristr($rowdata,"\r\n\r\n");
		$body=substr($body,4,strlen($body));
		return $body;
	}
	return false;
}  

方法5:用fsockopen函数打开url,以POST方式获取完整的数据,包括header和body

  
function HTTP_POST($URL,$data,$cookie,$referrer=""){  
	$URL_INFO = parse_url($URL);		//parsing the given URL

	// Building referrer
	if($referrer == ""){	//if not given use this script as referrer
		$referrer = "111";
	}

	// making string from $data
	foreach($data as $key=>$value){	
		$values[] = "$key=".urlencode($value);
	}

	$data_string = implode("&",$values);

	// Find out which port is needed - if not given use standard (=80)
	if(!isset($URL_INFO["port"])){
		$URL_INFO["port"] = 80;
	}
	
	// building POST-request:
	$request.="POST ".$URL_INFO["path"]." HTTP/1.1\n";
	$request.="Host: ".$URL_INFO["host"]."\n";
	$request.="Referer: $referer\n";
	$request.="Content-type: application/x-www-form-urlencoded\n";
	$request.="Content-length: ".strlen($data_string)."\n";
	$request.="Connection: close\n";
	$request.="Cookie:$cookie\n";  
	$request.="\n";  
	$request.=$data_string."\n"; 

	$fp = fsockopen($URL_INFO["host"],$URL_INFO["port"]); 
	fputs($fp, $request);
	while(!feof($fp)){
		$result .= fgets($fp, 1024);  
	}
	fclose($fp);
	return $result;
}  

方法6:使用curl库,使用curl库之前,可能需要查看一下php.ini是否已经打开了curl扩展

  
	$ch = curl_init();  
	$timeout = 5;  
	curl_setopt ($ch, CURLOPT_URL, 'http://www.dodobook.net/');  
	curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);  
	curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);  
	$file_contents = curl_exec($ch);  
	curl_close($ch);  
	echo $file_contents;  

珍惜一切时间,用于有益之事,不搞无谓之举。----富兰克林