php 仿asp xmlhttprequest请求数据代码
类名: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 { //开源代码phpfensi.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("杭州")); echo($myhttp->getresponsebody()); }else if($act == "header_useragent"){ //向服务器发送user-agent $myhttp = new httprequest("$responseurl?a=text","post"); $myhttp->open(); $myhttp->setrequestheader("referer","http://www.baidu.com"); $myhttp->setrequestheader("user-agent","mozilla/4.0 (compatible; msie 7.0; windows nt 6.0; trident/4.0)"); $myhttp->send("name=anlige&city=" . urlencode("杭州")); echo($myhttp->getresponsebody()); }else if($act == "status"){ //获取服务器返回的状态 $myhttp = new httprequest("$responseurl?a=text","post"); $myhttp->open(); $myhttp->send("name=anlige&city=" . urlencode("杭州")); echo($myhttp->status . " " . $myhttp->statustext ."<br /><br />"); echo($myhttp->getresponsebody()); }else if($act == "get_headers"){ //获取服务器响应头 $myhttp = new httprequest("$responseurl?a=text","get"); $myhttp->open(); $myhttp->send("name=anlige&city=" . urlencode("杭州")); echo($myhttp->getallresponseheaders()."<br /><br />"); echo($myhttp->getresponseheader("server")."<br /><br />"); }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" />"); } ?>查看更多关于php 仿asp xmlhttprequest请求数据代码 - php高级应用的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did30235