模拟get和post请求(支持自定义header和测试CDN节点)

简介:
下面是一个模拟get或者post请求的方法支持
1.get,post方法
2.自定义参数
3.自定义header
4.返回服务器的返回内容和header
5.支持相特定的服务器请求url,适合测试cdn节点
代码如下

 

 
  1. <?php  
  2. error_reporting(0);  
  3. $user_agent="Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10)";  
  4.  
  5. list($rheaders,$conntent)=request_url("60.28.14.148","80","get","http://mat1.gtimg.com/www/iskin960/qqcomlogo.png",array("User-Agent"=> $user_agent),array());  
  6.  
  7. //list($rheaders,$conntent)=request_url("","","get","http://www.baidu.com/s",array("User-Agent"=>$user_agent),array("wd"=>"test"));  
  8. if($rheaders["httpstatus"]>=200&&$rheaders["httpstatus"]<=300)  
  9. {  
  10.  
  11.   //根据返回的类型,修改header  
  12.   if($rheaders['Content-Type']!="")  
  13.     header('Content-Type: '.$rheaders['Content-Type']);  
  14.     echo     $conntent;  
  15. //    foreach($rheaders as $k => $v)echo "$k: $v<br/>";  
  16. }else 
  17. {  
  18.     //若是是302,301之类跳转的话,继续取跳转的  
  19.     if($rheaders["httpstatus"]>=300&&$rheaders["httpstatus"]<=400){  
  20.             list($rheaders,$conntent)=request_url("","","get",$rheaders["Location"],array("User-Agent"=> $user_agent),array());          
  21.             if($rheaders["httpstatus"]>=200&&$rheaders["httpstatus"]<=300)  
  22.             {  
  23.              //根据返回的类型,修改header  
  24.              if($rheaders['Content-Type'])  
  25.                     header('Content-Type: '.$rheaders['Content-Type']);  
  26.                 echo     $conntent;  
  27.             }  
  28.     }  
  29.     //    foreach($rheaders as $k => $v)echo "$k: $v<br/>";  
  30. }  
  31.  
  32.  
  33.  
  34. /*  
  35.  * 模拟get,post方法向服务器请求某url的内容,返回内容和状态码  
  36.  * 参数: $ip:url所在的服务器ip或者域名,当传入为空时,ip的默认值就是$aURL里包含host(ip或者域名)  
  37.          $port:int,url所在的服务器的端口,当传入为空时,ip的默认值就是$aURL里包含端口,若是没有的话为80  
  38.          $method:get还是post,缺省为post  
  39.          $aURL:请求的url,格式为http://username:password@hostname:port/path?arg=value#anchor  
  40.          $headers:数组,需要模拟的http头部(Referer,Content-Disposition,Expires,Cookie,Pragma,User-Agent,Accept-Language等等)  
  41.                        $headers=array("Referer"=>"http://123.com","User-Agent"=>"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10)");  
  42.          $aParamsArray:数组,需要post或者get的参数  
  43.                        $aParamsArray=array("id"=>123,"name"=>"abc");  
  44.  * 返回值:数组:第一个元素为返回的http头部数组(http状态(默认为0,连接错误为-1)),第二个为返回的内容  
  45.            
  46. */ 
  47. function request_url($ip,$port,$method,$aURL,$headers,$aParamsArray)  
  48. {  
  49.     $rheaders=array();  
  50.      $rheaders["httpstatus"]=0;  
  51.     //分解URL为host,端口,和路径  
  52.     $URL=parse_url($aURL);  
  53.     if(!$port)  
  54.     {  
  55.         //缺省端口为80  
  56.         $port=($URL["port"]? $URL["port"]:80);      
  57.     }  
  58.     if(strcasecmp($method,"get")==0){  
  59.         $method="GET";  
  60.     }else{  
  61.         $method="POST";  
  62.     }  
  63.     //把post的数据放到数据段里  
  64.     foreach($aParamsArray as $key=> $value)  
  65.     {  
  66.      if($flag!=0)  
  67.      {  
  68.      $params.="&";  
  69.      $flag=1;  
  70.      }  
  71.      $params.=$key."=";  
  72.      $params.=urlencode($value);  
  73.      $flag=1;  
  74.     }  
  75.         if($method=="POST")  
  76.         {  
  77.      //获得数据段长度,放入Content-Length  
  78.      $length=strlen($params);  
  79.  
  80.          }else 
  81.          {  
  82.           $length=0;  
  83.           //把数据放到url的参数后面  
  84.           $URL["query"]=$URL["query"]."&".$params;  
  85.          }  
  86.          if($URL["query"]){  
  87.              //添加参数  
  88.              $URL["path"].="?".$URL["query"].($URL["fragment"]?"#".$URL["fragment"]:"");  
  89.          }  
  90.      //创建socket连接  
  91.      $fp=fsockopen($ip==""$URL["host"]:$ip,$port,$errno,$errstr,10);  
  92.      if(!$fp)  
  93.      {  
  94.           $rheaders["httpstatus"]=-1;  
  95.              return array($rheaders,$errstr."--->".$errno);  
  96.      }  
  97.      //去掉不多余的头部  
  98.      unset($headers['Host']);  
  99.      unset($headers['Content-Length']);  
  100.      unset($headers['Content-Type']);  
  101.      //构造post请求的头  
  102.      $header="$method ".$URL["path"]." HTTP/1.1\r\n";  
  103.      $header.="Host:".$URL["host"]."\r\n";  
  104.      foreach($headers as $k=> $v){  
  105.          $header.="$k:$v\r\n";  
  106.      }  
  107.      if(!$header["Content-Type"]){  
  108.      $header.="Content-Type:application/x-www-form-urlencoded\r\n";  
  109.           }  
  110.      $header.="Content-Length:".$length."\r\n";  
  111.      $header.="Connection:Close\r\n\r\n";  
  112.      if($method=="POST")  
  113.          {  
  114.          //添加post的字符串  
  115.          $header.=$params."\r\n";  
  116.      }  
  117. //     echo $header;  
  118.      //发送post的数据  
  119.      fputs($fp,$header);  
  120.      $inheader=1;  
  121.      $lineno=0;  
  122.      $conntent="";  
  123.  
  124.      while(!feof($fp))  
  125.      {  
  126.           if($inheader){  
  127.          $line=fgets($fp,1024);//读取header  
  128.          }else{  
  129.              if($rheaders["Content-Length"]>=0){  
  130.                  $line=fread($fp,$rheaders["Content-Length"]);//读取返回内容  
  131.              }else{  
  132.                  $line=fread($fp,1024);//读取返回内容      
  133.              }  
  134.          }  
  135.      $lineno++;  
  136.      if($inheader){  
  137.          if($lineno==1)  
  138.          {  
  139.                  //从第一行,获取返回的状态码  
  140.                  if(preg_match("/^HTTP\/1\.[1|0] (\d{3})/i",$line,$match)){  
  141.                      $rheaders["httpstatus"]=$match[1];  
  142.                  }  
  143.          }  
  144.      //解析http头部,把所有字段  
  145.          if(preg_match("/^(.*): (.*)$/i",$line,$matches)){  
  146.                         $rheaders[$matches[1]]=$matches[2];  
  147.          }  
  148.      }  
  149.      if($inheader&&($line=="\n"||$line=="\r\n")){  
  150.      $inheader=0;  
  151.      continue;  
  152.      }  
  153.      if($inheader==0)  
  154.      {  
  155.          //获得返回内容  
  156.      $conntent.=$line;  
  157.      }  
  158.      }  
  159.     fclose($fp);  
  160.     return array($rheaders,$conntent);  
  161. }  
  162. ?> 

      本文转自yifangyou 51CTO博客,原文链接:http://blog.51cto.com/yifangyou/604613,如需转载请自行联系原作者


相关文章
|
3月前
|
JSON 数据格式 开发者
Postman模仿GET/POST请求进行接口的本地测试
接口是软件开发中常用的概念,是软件生产过程中比较核心的任务。对于接口开发者,调试接口是一件较为繁琐的事情,很多时候需要线上线下来回切换。在这里,我就跟大家介绍一个只需要在本地就可以调试接口的方法。
59 0
|
6月前
|
前端开发 安全 程序员
测试大姐趁我下班点又提了个bug!前端你咋多个options请求?
测试大姐趁我下班点又提了个bug!前端你咋多个options请求?
46 0
|
3月前
阿萨聊测试:如何用Postman 发送请求?
阿萨聊测试:如何用Postman 发送请求?
|
4月前
|
Web App开发 测试技术 API
Postman软件基本用法:浏览器复制请求信息并导入到软件从而测试、发送请求
Postman软件基本用法:浏览器复制请求信息并导入到软件从而测试、发送请求
|
4月前
|
Java 测试技术 持续交付
百度搜索:蓝易云【NetMock简介:简化 Java,Android和Kotlin多平台中的HTTP请求测试?】
使用NetMock,您可以在单元测试、集成测试和端到端测试中轻松地模拟和验证HTTP请求和响应,而无需实际发送请求到外部服务。这样可以提高测试的可靠性和可控性,并加快测试执行的速度。无论是在开发过程中还是在持续集成环境中,NetMock都可以帮助您更轻松地进行HTTP请求测试,提高代码质量和稳定性。
41 1
|
4月前
|
测试技术 Go
【测试平台系列】第一章 手撸压力机(五)- 结构化http请求配置
我们现在将上一级称之为TestObject(测试对象),现在我们梳理一下TO(测试对象简称,以后的文章中TO都代表测试对象)都需要哪些字段。
|
5月前
|
测试技术
【测试平台系列】第一章手撸压力机(三)自定义http请求
今天继续深入往下讲,上一篇咱们对http的客户端设置进行了结构化统一,现在咱们开始对http请求进行结构化统一,首先咱们梳理http请求包含的结构。
|
5月前
|
Web App开发 IDE 搜索推荐
【测试平台系列】第一章 手撸压力机(1)简单的http请求实现
测试平台,我们首先从手撸压力机开始。压力机也就是所谓的客户端,我们发送的请求是从这里开始对服务端的接口进行访问。
|
6月前
|
中间件 测试技术 数据库
软件测试|测试平台开发-Flask 入门:Flask HTTP请求详解
软件测试|测试平台开发-Flask 入门:Flask HTTP请求详解
41 0
|
6月前
|
网络协议 算法 前端开发
记一次测试中对请求验证的处理
记一次测试中对请求验证的处理