加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

使用PHP的`XMLHttpRequest`函数向服务器发送HTTP请求并获取数据的示例代码

发布时间:2023-08-10 13:08:47 所属栏目:PHP教程 来源:
导读:类名:httprequest($url="",$method="get",$usesocket=0)

$url为请求的地址;默认请求方法为get;$usesocket默认为0,使用fsockopen方法,如果设置为1则使用socket_create方法

方法:

open($ip="",$port=-1)
类名:httprequest($url="",$method="get",$usesocket=0) 

$url为请求的地址;默认请求方法为get;$usesocket默认为0,使用fsockopen方法,如果设置为1则使用socket_create方法

方法:

open($ip="",$port=-1) //打开同服务器的连接,默认不用设置这两个参数(一个同事在linux用的时候,请求的不是hostname解析的ip,因此加了这两个参数,以连接真实的服务器ip) 

settimeout($timeout=0) //设置获取数据的超时时间,必须在send方法调用之前设置才有效,单位秒,默认值0为不限制 

setrequestheader($key,$value="") //设置请求头,必须在send方法调用之前设置才有效 

removerequestheader($key,$value="") //移除指定键值的请求头,必须在send方法调用之前调用才有效 

send($data="") //发送数据$data到服务器 

getresponsebody() //获取服务器返回的文本 

getallresponseheaders() //获取服务器响应的所有头信息 

getresponseheader($key) //获取服务器响应的某个头信息,例如server,set_cookie等

属性:

$url //要请求的url 

$method //请求方法(post/get) 

$port //请求的端口 

$hostname //请求的主机名 

$uri //url的文件部分 

$protocol //请求协议(http)(包括本属性的以上5个属性均由程序自动通过url分析) 

$excption //异常信息 

$_headers=array() //请求头array("key"=>"value") 

$_senddata //发送到服务器的数据 

$status //返回的状态码 

$statustext //状态信息 

$httpprotocolversion //服务器的http协议版本

注意:

host头由程序自动设置,当用post方法请求时,content-length和content-type已被自动设置.

支持gzip压缩的页面,inc.http.php文件代码如下:

<?php 
class httprequest{ 
 public $url,$method,$port,$hostname,$uri,$protocol,$excption,$_headers=array(),$_senddata,$status,$statustext,$httpprotocolversion; 
 private $fp=0,$_buffer="",$responsebody,$responseheader,$timeout=0,$usesocket; 
 //构造函数 
 function __construct($url="",$method="get",$usesocket=0){ 
  $this->url = $url; 
  $this->method = strtoupper($method); 
  $this->usesocket = $usesocket; 
  $this->setrequestheader("accept","*/*"); 
  $this->setrequestheader("accept-language","zh-cn"); 
  $this->setrequestheader("accept-encoding","gzip, deflate"); 
  $this->setrequestheader("user-agent","httprequest class 1.0");  //可调用setrequestheader来修改 
 } 
 
 //连接服务器 
 public function open($ip="",$port=-1){ 
  if(!$this->_geturlinfo()) return false; 
  $this->setrequestheader("host",$this->hostname); 
  $this->setrequestheader("connection","close"); 
  $ip = ($ip=="" ? $this->hostname : $ip); 
  $port = ($port==-1 ? $this->port : $port); 
  if($this->usesocket==1){ 
   if(!$this->fp=$socket=socket_create(af_inet,sock_stream,0)) { 
    $this->excption="can not create socket";return false; 
   }else{ 
    if(!socket_connect($this->fp,$ip, $port) ){ 
     $this->excption="can not connect to server " . $this->hostname . " on port" . $this->port;return false; 
    } 
   } 
  }else{ 
   if(!$this->fp=fsockopen($ip, $port,$errno,$errstr,10)) { 
    $this->excption="can not connect to server " . $this->hostname . " on port" . $this->port;return false; 
   } 
  } 
  return true; 
 } 
 
 public function send($data=""){ 
  if(!$this->fp){$this->excption="is not a resource id";return false;} 
  if($this->method=="get" && $data!=""){ 
   $s_str="?"; 
   if(strpos($this->uri,"?")>0) $s_str = "&"; 
   $this->uri.= $s_str . $data; 
   $data=""; 
  } 
  $senddata=$this->method . " " . $this->uri . " http/1.1rn"; 
  if($this->method=="post"){ 
   $this->setrequestheader("content-length",strlen($data)); 
   $this->setrequestheader("content-type", "application/x-www-form-urlencoded"); 
  } 
  foreach($this->_headers as $keys => $value){ 
   $senddata .= "$keys: $valuern"; 
  } 
  $senddata .= "rn"; 
  if($this->method=="post") $senddata .= $data; 
  $this->_senddata = $senddata; 
  if($this->usesocket==1){ 
   socket_write($this->fp,$this->_senddata); 
   $buffer=""; 
   $timestart = time(); 
   do{ 
    if($this->timeout>0){ 
     if(time()-$timestart>$this->timeout){break;} 
    } 
    $this->_buffer.=$buffer; 
    $buffer = socket_read($this->fp,4096); 
   }while($buffer!=""); 
   socket_close($this->fp);  
  }else{ 
   fputs($this->fp, $senddata); 
   $this->_buffer=""; 
   $timestart = time(); 
   while(!feof($this->fp)) 
   { 
    if($this->timeout>0){ 
     if(time()-$timestart>$this->timeout){break;} 
    } 
    $this->_buffer.=fgets($this->fp,4096); 
   } 
   fclose($this->fp);    
  } 
  $this->_splitcontent(); 
  $this->_getheaderinfo(); 
 } 
 
 public function getresponsebody(){ 
  if($this->getresponseheader("content-encoding")=="gzip" && $this->getresponseheader("transfer-encoding")=="chunked"){ 
   return gzdecode_1(transfer_encoding_chunked_decode($this->responsebody)); 
  }else if($this->getresponseheader("content-encoding")=="gzip"){ 
   return gzdecode_1($this->responsebody); 
  }else{ 
   return $this->responsebody; 
  } 
 } 
 
 public function getallresponseheaders(){ 
  return  $this->responseheader; 
 } 
 
 public function getresponseheader($key){ 
  $key = str_replace("-","-",$key); 
  $headerstr = $this->responseheader . "rn"; 
  $count = preg_match_all("/n$key:(.+?)r/is",$headerstr,$result,preg_set_order); 
  if($count>0){ 
   $returnstr=""; 
   foreach($result as $key1=>$value){ 
    if(strtoupper($key)=="set-cookie"){ 
     $value[1] = substr($value[1],0,strpos($value[1],";")); 
    } 
    $returnstr .= ltrim($value[1]) . "; "; 
   } 
   $returnstr = substr($returnstr,0,strlen($returnstr)-2); 
   return $returnstr; 
  }else{return "";} 
 } 
 
 public function settimeout($timeout=0){ 
  $this->timeout = $timeout;  
 } 
 
 public function setrequestheader($key,$value=""){ 
  $this->_headers[$key]=$value; 
 } 
 
 public function removerequestheader($key){ 
  if(count($this->_headers)==0){return;} 
  $_temp=array(); 
  foreach($this->_headers as $keys => $value){ 
   if($keys!=$key){ 
    $_temp[$keys]=$value; 
   } 
  } 
  $this->_headers = $_temp; 
 } 
 
 //拆分url 
 private function _geturlinfo(){ 
  $url = $this->url; 
  $count = preg_match("/^http://([^:/]+?)(:(d+))?/(.+?)$/is",$url,$result); 
  if($count>0){ 
   $this->uri="/" . $result[4]; 
  }else{ 
   $count = preg_match("/^http://([^:/]+?)(:(d+))?(/)?$/is",$url,$result); 
   if($count>0){ 
    $this->uri="/"; 
   } 
  } 
  if($count>0){ 
   $this->protocol="http"; 
   $this->hostname=$result[1]; 
   if(isset($result[2]) && $result[2]!="") {$this->port=intval($result[3]);}else{$this->port=80;} 
   return true; 
  }else{$this->excption="url format error";return false;} 
 } 
 
 private function _splitcontent(){ 
  $this->responseheader=""; 
  $this->responsebody=""; 
  $p1 = strpos($this->_buffer,"rnrn"); 
  if($p1>0){ 
   $this->responseheader = substr($this->_buffer,0,$p1); 
   if($p1+4<strlen($this->_buffer)){ 
    $this->responsebody = substr($this->_buffer,$p1+4); 
   } 
  } 
 } 
 
 private function _getheaderinfo(){ 
  $headerstr = $this->responseheader; 
  $count = preg_match("/^http/(.+?)s(d+)s(.+?)rn/is",$headerstr,$result); 
  if($count>0){ 
   $this->httpprotocolversion = $result[1]; 
   $this->status = intval($result[2]); 
   $this->statustext = $result[3]; 
  } 
 } 

 
//以下两函数参考网络 
function gzdecode_1 ($data) {  
 $data = ($data); 
 if (!function_exists ( 'gzdecode' )) { 
  $flags = ord ( substr ( $data, 3, 1 ) ); 
  $headerlen = 10; 
  $extralen = 0; 
  $filenamelen = 0; 
  if ($flags & 4) { 
   $extralen = unpack ( 'v', substr ( $data, 10, 2 ) ); 
   $extralen = $extralen [1]; 
   $headerlen += 2 + $extralen; 
  } 
  if ($flags & 8) // filename  
   $headerlen = strpos ( $data, chr ( 0 ), $headerlen ) + 1; 
  if ($flags & 16) // comment  
   $headerlen = strpos ( $data, chr ( 0 ), $headerlen ) + 1; 
  if ($flags & 2) // crc at end of file  
   $headerlen += 2; 
  $unpacked = @gzinflate ( substr ( $data, $headerlen ) ); 
  if ($unpacked === false) 
   $unpacked = $data; 
  return $unpacked; 
 }else{ 
  return gzdecode($data); 
 } 

function transfer_encoding_chunked_decode($in) { 
 $out = ""; 
 while ( $in !="") { 
  $lf_pos = strpos ( $in, "12" ); 
  if ($lf_pos === false) { 
   $out .= $in; 
   break; 
  } 
  $chunk_hex = trim ( substr ( $in, 0, $lf_pos ) ); 
  $sc_pos = strpos ( $chunk_hex, ';' ); 
  if ($sc_pos !== false) 
   $chunk_hex = substr ( $chunk_hex, 0, $sc_pos ); 
  if ($chunk_hex =="") { 
   $out .= substr ( $in, 0, $lf_pos ); 
   $in = substr ( $in, $lf_pos + 1 ); 
   continue; 
  } 
  $chunk_len = hexdec ( $chunk_hex ); 
  if ($chunk_len) { 
   $out .= substr ( $in, $lf_pos + 1, $chunk_len ); 
   $in = substr ( $in, $lf_pos + 2 + $chunk_len ); 
  } else {//开源代码Cuoxin.com 
   $in = ""; 
  } 
 } 
 return $out; 

function utf8togb($str){ 
 return iconv("utf-8","gbk",$str); 

function gbtoutf8($str){ 
 return iconv("gbk","utf-8",$str); 

?> 

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章