当前位置:首页 > PHP教程 > php高级应用 > 列表

php 仿asp xmlhttprequest请求数据代码

发布:smiling 来源: PHP粉丝网  添加日期:2014-09-08 20:52:50 浏览: 评论:0 

类名: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文件代码如下:

  1. <?php 
  2. class httprequest{ 
  3.  public $url,$method,$port,$hostname,$uri,$protocol,$excption,$_headers=array(),$_senddata,$status,$statustext,$httpprotocolversion
  4.  private $fp=0,$_buffer="",$responsebody,$responseheader,$timeout=0,$usesocket
  5.  //构造函数 
  6.  function __construct($url="",$method="get",$usesocket=0){ 
  7.   $this->url = $url
  8.   $this->method = strtoupper($method); 
  9.   $this->usesocket = $usesocket
  10.   $this->setrequestheader("accept","*/*"); 
  11.   $this->setrequestheader("accept-language","zh-cn"); 
  12.   $this->setrequestheader("accept-encoding","gzip, deflate"); 
  13.   $this->setrequestheader("user-agent","httprequest class 1.0");  //可调用setrequestheader来修改 
  14.  } 
  15.  
  16.  //连接服务器 
  17.  public function open($ip="",$port=-1){ 
  18.   if(!$this->_geturlinfo()) return false; 
  19.   $this->setrequestheader("host",$this->hostname); 
  20.   $this->setrequestheader("connection","close"); 
  21.   $ip = ($ip=="" ? $this->hostname : $ip); 
  22.   $port = ($port==-1 ? $this->port : $port); 
  23.   if($this->usesocket==1){ 
  24.    if(!$this->fp=$socket=socket_create(af_inet,sock_stream,0)) { 
  25.     $this->excption="can not create socket";return false; 
  26.    }else
  27.     if(!socket_connect($this->fp,$ip$port) ){ 
  28.      $this->excption="can not connect to server " . $this->hostname . " on port" . $this->port;return false; 
  29.     } 
  30.    } 
  31.   }else
  32.    if(!$this->fp=fsockopen($ip$port,$errno,$errstr,10)) { 
  33.     $this->excption="can not connect to server " . $this->hostname . " on port" . $this->port;return false; 
  34.    } 
  35.   } 
  36.   return true; 
  37.  } 
  38.  
  39.  public function send($data=""){ 
  40.   if(!$this->fp){$this->excption="is not a resource id";return false;} 
  41.   if($this->method=="get" && $data!=""){ 
  42.    $s_str="?"
  43.    if(strpos($this->uri,"?")>0) $s_str = "&"
  44.    $this->uri.= $s_str . $data
  45.    $data=""
  46.   } 
  47.   $senddata=$this->method . " " . $this->uri . " http/1.1rn"
  48.   if($this->method=="post"){ 
  49.    $this->setrequestheader("content-length",strlen($data)); 
  50.    $this->setrequestheader("content-type""application/x-www-form-urlencoded"); 
  51.   } 
  52.   foreach($this->_headers as $keys => $value){ 
  53.    $senddata .= "$keys: $valuern"
  54.   } 
  55.   $senddata .= "rn"
  56.   if($this->method=="post"$senddata .= $data
  57.   $this->_senddata = $senddata
  58.   if($this->usesocket==1){ 
  59.    socket_write($this->fp,$this->_senddata); 
  60.    $buffer=""
  61.    $timestart = time(); 
  62.    do
  63.     if($this->timeout>0){ 
  64.      if(time()-$timestart>$this->timeout){break;} 
  65.     } 
  66.     $this->_buffer.=$buffer
  67.     $buffer = socket_read($this->fp,4096); 
  68.    }while($buffer!=""); 
  69.    socket_close($this->fp);  
  70.   }else
  71.    fputs($this->fp, $senddata); 
  72.    $this->_buffer=""
  73.    $timestart = time(); 
  74.    while(!feof($this->fp)) 
  75.    { 
  76.     if($this->timeout>0){ 
  77.      if(time()-$timestart>$this->timeout){break;} 
  78.     } 
  79.     $this->_buffer.=fgets($this->fp,4096); 
  80.    } 
  81.    fclose($this->fp);    
  82.   } 
  83.   $this->_splitcontent(); 
  84.   $this->_getheaderinfo(); 
  85.  } 
  86.  
  87.  public function getresponsebody(){ 
  88.   if($this->getresponseheader("content-encoding")=="gzip" && $this->getresponseheader("transfer-encoding")=="chunked"){ 
  89.    return gzdecode_1(transfer_encoding_chunked_decode($this->responsebody)); 
  90.   }else if($this->getresponseheader("content-encoding")=="gzip"){ 
  91.    return gzdecode_1($this->responsebody); 
  92.   }else
  93.    return $this->responsebody; 
  94.   } 
  95.  } 
  96.  
  97.  public function getallresponseheaders(){ 
  98.   return  $this->responseheader; 
  99.  } 
  100.  
  101.  public function getresponseheader($key){ 
  102.   $key = str_replace("-","-",$key); 
  103.   $headerstr = $this->responseheader . "rn"
  104.   $count = preg_match_all("/n$key:(.+?)r/is",$headerstr,$result,preg_set_order); 
  105.   if($count>0){ 
  106.    $returnstr=""
  107.    foreach($result as $key1=>$value){ 
  108.     if(strtoupper($key)=="set-cookie"){ 
  109.      $value[1] = substr($value[1],0,strpos($value[1],";")); 
  110.     } 
  111.     $returnstr .= ltrim($value[1]) . "; "
  112.    } 
  113.    $returnstr = substr($returnstr,0,strlen($returnstr)-2); 
  114.    return $returnstr
  115.   }else{return "";} 
  116.  } 
  117.  
  118.  public function settimeout($timeout=0){ 
  119.   $this->timeout = $timeout;  
  120.  } 
  121.  
  122.  public function setrequestheader($key,$value=""){ 
  123.   $this->_headers[$key]=$value
  124.  } 
  125.  
  126.  public function removerequestheader($key){ 
  127.   if(count($this->_headers)==0){return;} 
  128.   $_temp=array(); 
  129.   foreach($this->_headers as $keys => $value){ 
  130.    if($keys!=$key){ 
  131.     $_temp[$keys]=$value
  132.    } 
  133.   } 
  134.   $this->_headers = $_temp
  135.  } 
  136.  
  137.  //拆分url 
  138.  private function _geturlinfo(){ 
  139.   $url = $this->url; 
  140.   $count = preg_match("/^http://([^:/]+?)(:(d+))?/(.+?)$/is",$url,$result); 
  141.   if($count>0){ 
  142.    $this->uri="/" . $result[4]; 
  143.   }else
  144.    $count = preg_match("/^http://([^:/]+?)(:(d+))?(/)?$/is",$url,$result); 
  145.    if($count>0){ 
  146.     $this->uri="/"
  147.    } 
  148.   } 
  149.   if($count>0){ 
  150.    $this->protocol="http"
  151.    $this->hostname=$result[1]; 
  152.    if(isset($result[2]) && $result[2]!="") {$this->port=intval($result[3]);}else{$this->port=80;} 
  153.    return true; 
  154.   }else{$this->excption="url format error";return false;} 
  155.  } 
  156.  
  157.  private function _splitcontent(){ 
  158.   $this->responseheader=""
  159.   $this->responsebody=""
  160.   $p1 = strpos($this->_buffer,"rnrn"); 
  161.   if($p1>0){ 
  162.    $this->responseheader = substr($this->_buffer,0,$p1); 
  163.    if($p1+4<strlen($this->_buffer)){ 
  164.     $this->responsebody = substr($this->_buffer,$p1+4); 
  165.    } 
  166.   } 
  167.  } 
  168.  
  169.  private function _getheaderinfo(){ 
  170.   $headerstr = $this->responseheader; 
  171.   $count = preg_match("/^http/(.+?)s(d+)s(.+?)rn/is",$headerstr,$result); 
  172.   if($count>0){ 
  173.    $this->httpprotocolversion = $result[1]; 
  174.    $this->status = intval($result[2]); 
  175.    $this->statustext = $result[3]; 
  176.   } 
  177.  } 
  178.  
  179. //以下两函数参考网络 
  180. function gzdecode_1 ($data) {  
  181.  $data = ($data); 
  182.  if (!function_exists ( 'gzdecode' )) { 
  183.   $flags = ord ( substr ( $data, 3, 1 ) ); 
  184.   $headerlen = 10; 
  185.   $extralen = 0; 
  186.   $filenamelen = 0; 
  187.   if ($flags & 4) { 
  188.    $extralen = unpack ( 'v'substr ( $data, 10, 2 ) ); 
  189.    $extralen = $extralen [1]; 
  190.    $headerlen += 2 + $extralen
  191.   } 
  192.   if ($flags & 8) // filename  
  193.    $headerlen = strpos ( $datachr ( 0 ), $headerlen ) + 1; 
  194.   if ($flags & 16) // comment  
  195.    $headerlen = strpos ( $datachr ( 0 ), $headerlen ) + 1; 
  196.   if ($flags & 2) // crc at end of file  
  197.    $headerlen += 2; 
  198.   $unpacked = @gzinflate ( substr ( $data$headerlen ) ); 
  199.   if ($unpacked === false) 
  200.    $unpacked = $data
  201.   return $unpacked
  202.  }else
  203.   return gzdecode($data); 
  204.  } 
  205. function transfer_encoding_chunked_decode($in) { 
  206.  $out = ""
  207.  while ( $in !="") { 
  208.   $lf_pos = strpos ( $in"12" ); 
  209.   if ($lf_pos === false) { 
  210.    $out .= $in
  211.    break
  212.   } 
  213.   $chunk_hex = trim ( substr ( $in, 0, $lf_pos ) ); 
  214.   $sc_pos = strpos ( $chunk_hex';' ); 
  215.   if ($sc_pos !== false) 
  216.    $chunk_hex = substr ( $chunk_hex, 0, $sc_pos ); 
  217.   if ($chunk_hex =="") { 
  218.    $out .= substr ( $in, 0, $lf_pos ); 
  219.    $in = substr ( $in$lf_pos + 1 ); 
  220.    continue
  221.   } 
  222.   $chunk_len = hexdec ( $chunk_hex ); 
  223.   if ($chunk_len) { 
  224.    $out .= substr ( $in$lf_pos + 1, $chunk_len ); 
  225.    $in = substr ( $in$lf_pos + 2 + $chunk_len ); 
  226.   } else {//开源代码phpfensi.com 
  227.    $in = ""
  228.   } 
  229.  } 
  230.  return $out
  231. function utf8togb($str){ 
  232.  return iconv("utf-8","gbk",$str); 
  233. function gbtoutf8($str){ 
  234.  return iconv("gbk","utf-8",$str); 
  235. ?> 

response.asp文件,代码如下:

  1. <% 
  2. response.cookies("a") = "anlige" 
  3. response.cookies("a").expires = dateadd("yyyy",1,now()) 
  4. response.cookies("b")("c") = "wsdasdadsa" 
  5. response.cookies("b")("d") = "ddd" 
  6. response.cookies("b").expires = dateadd("yyyy",1,now()) 
  7. response.write "querystring : " & request.querystring & "<br />" 
  8. for each v in request.querystring 
  9.  response.write v & "=" & request.querystring(v) & "<br />" 
  10. next 
  11. response.write "<br />form : " &  request.form  & "<br />" 
  12. for each v in request.form 
  13.  response.write v & "=" & request.form(v) & "<br />" 
  14. next 
  15. response.write "<br />url : " &  request.servervariables("url")  & "<br />" 
  16. response.write "referer : " &  request.servervariables("http_referer")  & "<br />" 
  17. response.write "host : " &  request.servervariables("http_host")  & "<br />" 
  18. response.write "user-agent : " &  request.servervariables("http_user_agent")  & "<br />" 
  19. response.write "cookie" & request.servervariables("http_cookie") 
  20. %> 
  21. index.php文件 
  22. <a href="?action=get">get传数据</a> 
  23. <a href="?action=post">post传数据</a> 
  24. <a href="?action=header_referer">向服务器发送来路信息</a> 
  25. <a href="?action=header_useragent">向服务器发送user-agent</a> 
  26. <a href="?action=status">获取服务器返回的状态</a> 
  27. <a href="?action=get_headers">获取服务器响应头</a> 
  28. <a href="?action=get_image">保存图片</a><br /><br /><br /> 
  29. <?php 
  30. include("inc_http.php"); 
  31. $responseurl = "http://dev.mo.cn/aiencode/http/response.asp"; 
  32. $act = isset($_get["action"]) ? $_get["action"] : ""; 
  33. if($act == "get"){  //get传数据 
  34.  $myhttp = new httprequest("$responseurl?a=text"); 
  35.  $myhttp->open(); 
  36.  $myhttp->send("name=anlige&city=" . urlencode("杭州")); 
  37.  echo($myhttp->getresponsebody());  
  38.  
  39. }else if($act == "post"){ //post传数据 
  40.  $myhttp = new httprequest("$responseurl?a=text","post"); 
  41.  $myhttp->open(); 
  42.  $myhttp->send("name=anlige&city=" . urlencode("杭州")); 
  43.  echo($myhttp->getresponsebody()); 
  44.  
  45. }else if($act == "header_referer"){  //向服务器发送来路信息 
  46.  $myhttp = new httprequest("$responseurl?a=text","post"); 
  47.  $myhttp->open(); 
  48.  $myhttp->setrequestheader("referer","http://www.baidu.com"); 
  49.  $myhttp->send("name=anlige&city=" . urlencode("杭州")); 
  50.  echo($myhttp->getresponsebody());  
  51.  
  52. }else if($act == "header_useragent"){  //向服务器发送user-agent 
  53.  $myhttp = new httprequest("$responseurl?a=text","post"); 
  54.  $myhttp->open(); 
  55.  $myhttp->setrequestheader("referer","http://www.baidu.com"); 
  56.  $myhttp->setrequestheader("user-agent","mozilla/4.0 (compatible; msie 7.0; windows nt 6.0; trident/4.0)"); 
  57.  $myhttp->send("name=anlige&city=" . urlencode("杭州")); 
  58.  echo($myhttp->getresponsebody());  
  59.  
  60. }else if($act == "status"){   //获取服务器返回的状态 
  61.  $myhttp = new httprequest("$responseurl?a=text","post"); 
  62.  $myhttp->open(); 
  63.  $myhttp->send("name=anlige&city=" . urlencode("杭州")); 
  64.  echo($myhttp->status . " " . $myhttp->statustext ."<br /><br />");  
  65.  echo($myhttp->getresponsebody()); 
  66.  
  67. }else if($act == "get_headers"){  //获取服务器响应头 
  68.  $myhttp = new httprequest("$responseurl?a=text","get"); 
  69.  $myhttp->open(); 
  70.  $myhttp->send("name=anlige&city=" . urlencode("杭州")); 
  71.  echo($myhttp->getallresponseheaders()."<br /><br />");   
  72.  echo($myhttp->getresponseheader("server")."<br /><br />");  
  73.  
  74. }else if($act == "get_image"){ 
  75.  
  76.  $myhttp = new httprequest("http://www.baidu.com/img/baidu_logo.gif"); 
  77.  $myhttp->open(); 
  78.  $myhttp->send();  
  79.  $fp = @fopen("demo.gif","w"); 
  80.  fwrite($fp,$myhttp->getresponsebody()); 
  81.  fclose($fp); 
  82.  echo("<img src="demo.gif" />"); 
  83. ?>

Tags: asp xmlhttprequest php请求数据

分享到: