zoukankan      html  css  js  c++  java
  • php模拟http请求的方法

    我在这里终结了三种方法

    第一种方法:fsockopen

    $flag = 0;
     $post = '';
     $errno = '';
     $errstr = '';
     //要post的数据
    $argv = array(
        'username'=>'vic',
        'content'=>'how are you , my friend?'
    );
    
    //构造要post的字符串
    foreach ($argv as $key=>$value) {
        if ($flag!=0) {
            $post .= "&";
            $flag = 1;
        }
        $post.= $key."="; $post.= urlencode($value);
        $flag = 1;
        }
        $length = strlen($post);
    
         //创建socket连接
       $fp = fsockopen("www.test.com",80,$errno,$errstr,10) or exit($errstr."--->".$errno);
    
        //构造post请求的头
        $header  = "POST /mysql.php HTTP/1.1
    ";
        $header .= "Host:www.test.com
    ";
        $header .= "Referer:/index.php
    ";
        $header .= "Content-Type: application/x-www-form-urlencoded
    ";
        $header .= "Content-Length: ".$length."
    ";
        $header .= "Connection: Close
    
    ";
        //添加post的字符串
        $header .= $post."
    ";
        
    
        //发送post的数据
       fputs($fp,$header);
        $inheader = 1;
        while (!feof($fp)) {
    
            $line = fgets($fp,1024); //去除请求包的头只显示页面的返回数据
            if ($inheader && ($line == "
    " || $line == "
    ")) {
                
                 $inheader = 0;
            }
            if ($inheader == 0) {
              echo $line;
            }
        }
    
    fclose($fp);
    
    $html=file_get_contents("http://www.baidu.com");
    echo $html;

    第二种方法:stream_context_create()

    $data=array('nickname'=>'yonghuming','Email'=>'假的');
    $data=http_build_query($data);
    //var_dump($data);
    $strlen=strlen($data);
    $opts=array('http'=>array(
            'method'=>'POST',
            'header'=>"Content-Type:application/x-www-form-urlencoded"."
    "."Content-Length:".$strlen."
    "."User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36"."
    "."Referer:http://www.test.com/stream.php"."
    ",
            'content'=>$data            
    ));
    
    $context=stream_context_create($opts);
    //var_dump($opts);
    $html=@file_get_contents("http://www.test.com/mysql.php",false,$context);
    echo $html;

    第三种方法:curl

    //初始化 
    $ch=curl_init();
    //设置选项
    curl_setopt($ch, CURLOPT_URL, "http://www.test.com/post.php");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//文件流输出,不是直接输出
    curl_setopt($ch, CURLOPT_HEADER, 0);//启用时,头文件信息作为数据流输出
    
    $data=array('nickname'=>'yonghuming','Email'=>'假的');
    $data=http_build_query($data);
    //var_dump($data);
    $strlen=strlen($data);
    //curl已经模拟了头部信息,如不是特需要求,可以不需要的
    /*$header=array("Content-Type:application/x-www-form-urlencoded","Content-Length:".$strlen,"User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36","Referer:http://www.test.com/stream.php");
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//模拟头部信息*/
    //设置post请求
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); //当请求https开头的时候,需要走php接口文件就需要走443端口,故false进行屏蔽。是否检测服务器的证书是否由正规浏览器认证过的授权CA颁发的
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    //设置cookie
    $cookie_jar = dirname(__FILE__)."/pic.cookie";
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);// 存放Cookie信息的文件名称  
    curl_setopt($ch,CURLOPT_COOKIEFILE,$cookie_jar); // 读取上面所储存的Cookie信息 
    curl_setopt($ch,CURLOPT_COOKIE,'age=12');//单独设置cookie,如何不用上面的两个方法 
    //3.执行
    $output=curl_exec($ch);
    //4.释放
    curl_close($ch);
    
    //var_dump($output);
    echo $output;

    post.php文件

    echo '<pre>';
    echo "this is the data posted";
    setcookie('name','vic');
    print_r($_POST);
    print_r($_COOKIE);
    echo '</pre>';

    结果

    this is the data postedArray
    (
        [nickname] => yonghuming
        [Email] => 假的
    )
    Array
    (
        [name] => vic
        [age] => 12
    )
    总结:php请求基本上此三种方法就可以了,此只是非常简单的入门,复杂的等以后再来总结吧。

  • 相关阅读:
    html 上传图片前预览
    php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法
    php 计算 pdf文件页数
    php 获取半年内每个月的订单数量, 总价, 月份
    php 获取两个数组之间不同的值
    小程序支付功能
    关于nginx的Job for nginx.service failed because the control process exited with error code.错误
    linux 安装 Apollo
    MongoDB待续。。。
    ABP vNext...待续
  • 原文地址:https://www.cnblogs.com/myvic/p/5813997.html
Copyright © 2011-2022 走看看