• 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请求基本上此三种方法就可以了,此只是非常简单的入门,复杂的等以后再来总结吧。

  • 相关阅读:
    Foj1675数论
    JSTL与EL之间的千丝万缕
    2013多校联合2 I Warm up 2(hdu 4619)
    ios视图切换之push与present混用
    Ruby设计模式透析之 —— 适配器(Adapter)
    晓说智能指针shared_ptr为何可以实现跨模块分配和释放内存
    CSS的力量
    MySQL-select 1;
    MySQL数据库-语言简介
    Eclipse开发工具提交代码
  • 原文地址:https://www.cnblogs.com/myvic/p/5813997.html
Copyright © 2020-2023  润新知