加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php 仿asp xmlhttprequest获取数据代码

发布时间:2022-02-16 15:39:33 所属栏目: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);
  }
  ?>
  response.asp文件,代码如下:
 
  <%
  response.cookies("a") = "anlige"
  response.cookies("a").expires = dateadd("yyyy",1,now())
  response.cookies("b")("c") = "wsdasdadsa"
  response.cookies("b")("d") = "ddd"
  response.cookies("b").expires = dateadd("yyyy",1,now())
  response.write "querystring : " & request.querystring & "<br />"
  for each v in request.querystring
   response.write v & "=" & request.querystring(v) & "<br />"
  next
  response.write "<br />form : " &  request.form  & "<br />"
  for each v in request.form
   response.write v & "=" & request.form(v) & "<br />"
  next
  response.write "<br />url : " &  request.servervariables("url")  & "<br />"
  response.write "referer : " &  request.servervariables("http_referer")  & "<br />"
  response.write "host : " &  request.servervariables("http_host")  & "<br />"
  response.write "user-agent : " &  request.servervariables("http_user_agent")  & "<br />"
  response.write "cookie" & request.servervariables("http_cookie")
  %>
  index.php文件
  <a href="?action=get">get传数据</a>
  <a href="?action=post">post传数据</a>
  <a href="?action=header_referer">向服务器发送来路信息</a>
  <a href="?action=header_useragent">向服务器发送user-agent</a>
  <a href="?action=status">获取服务器返回的状态</a>
  <a href="?action=get_headers">获取服务器响应头</a>
  <a href="?action=get_image">保存图片</a><br /><br /><br />
  <?php
  include("inc_http.php");
  $responseurl = "http://dev.mo.cn/aiencode/http/response.asp";
  $act = isset($_get["action"]) ? $_get["action"] : "";
  if($act == "get"){  //get传数据
   $myhttp = new httprequest("$responseurl?a=text");
   $myhttp->open();
   $myhttp->send("name=anlige&city=" . urlencode("杭州"));
   echo($myhttp->getresponsebody());  
  
  }else if($act == "post"){ //post传数据
   $myhttp = new httprequest("$responseurl?a=text","post");
   $myhttp->open();
   $myhttp->send("name=anlige&city=" . urlencode("杭州"));
   echo($myhttp->getresponsebody());
  
  }else if($act == "header_referer"){  //向服务器发送来路信息
   $myhttp = new httprequest("$responseurl?a=text","post");
   $myhttp->open();
   $myhttp->setrequestheader("referer","http://www.baidu.com");
   $myhttp->send("name=anlige&city=" . urlencode("杭州"));
    
  }else if($act == "get_image"){
  
   $myhttp = new httprequest("http://www.baidu.com/img/baidu_logo.gif");
   $myhttp->open();
   $myhttp->send();  
   $fp = @fopen("demo.gif","w");
   fwrite($fp,$myhttp->getresponsebody());
   fclose($fp);
   echo("<img src="demo.gif" />");
  }
  ?>

(编辑:云计算网_泰州站长网)

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

    热点阅读