php 仿asp xmlhttprequest获取数据代码
发布时间:2022-02-15 22:11:58 所属栏目: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" />"); } ?> (编辑:好传媒网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |