`
xiaoshenge
  • 浏览: 170031 次
  • 性别: Icon_minigender_1
  • 来自: 十堰
社区版块
存档分类
最新评论

fsockopen实现的HTTP请求

阅读更多
1.get方式,code来自于PHP手册:
    <?php
    $url='/new.php'.'?'.urlencode(id).'='.urlencode(88);
    $fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
        $out = "GET / HTTP/1.1\r\n";
        $out .= "Host: www.example.com\r\n";
        $out .= "Connection: Close\r\n\r\n";

        fwrite($fp, $out);
        while (!feof($fp)) {
        echo fgets($fp, 128);
        }
        fclose($fp);
    }
    ?>
//上面的code可以模拟浏览器www.example.com/new.php?id=88
2.post方式:
    <?php
    $host='www.example.com';
    $url='/login.php';
    $data=urlencode(username).'='.urlencode($username).urlencode(password).'='.urlencode($password);
    $fp=fsockopen("www.baidu.com",80,$errno,$errstr,30);
    if (!$fp) {
            echo "$errstr ($errno)<br />\n";
        } else {
            $out = "POST ".$url." HTTP/1.1\r\n";
            $out .= "Host: www.example.com\r\n";
            $out .= "Content-type: application/x-www-form-urlencoded\r\n";
            $out .= "Content-Length: ".$data."\r\n";
            $out .= "Connection: Close\r\n\r\n";
            $out .=$data;

            fwrite($fp, $out);
            while (!feof($fp)) {
            echo fgets($fp, 128);
            }
            fclose($fp);
    ?>
//上面的code可以模拟用户登录www.example.com/login.php
3.get与post的异同:
    -------------------------------------------------
    HTTP请求报文:request-line
            headers (0或有多个)
            /***headers***/
            //name1: content
            //name2: content
            //.....
            /***headers***/
            <blank line>
            body (只对POST请求有效)
    -------------------------------------------------
    HTTP响应报文:status-line
            headers (0或有多个)
            /***headers***/
            //name1: content
            //name2: content
            //.....
            /***headers***/
            <blank line>
            body (只对POST请求有效)
    -------------------------------------------------
从上面的报文格式可以看出,header之间的区分是换行"\r\n",header于body的区分是空白行,这就算为什么上面get、post最后都有"Connection: Close\r\n\r\n"原因。
get请求的url要经过urlencode编码,这就像浏览器的请求时看到的%23%23的一样,post请求的内容也要经过urlencode编码。
POST请求必需在header中加入"Content-type: application/x-www-form-urlencoded\r\n"和"Content-Length: ".$data."\r\n",post提交的数据要在"Connection: Close\r\n\r\n"之后发送,因为该数据相当请求的内容是在header之后的.
4.解析响应报文
也许我们只关心报文的头或者body,在报文格式中我们看到header于body的区分是空白行的。
            $headers = "";
                while ($str = trim(fgets($sock,4096)))
                    $headers .= "$str\n";
    
                $body = "";
                while (!feof($sock))
                    $body .= fgets($sock, 4096);
                fclose($sock);
                $this->responseText=$body;
//通过上面的代码就可以将header于body分开
字符串为空时(即空白行)其bool值为false,这样就把header与body分开了。
BTW-参考资料:《TCP/IP详解》卷三13章HTTP
                               HTTPClient类:http://scripts.incutio.com/httpclient/
分享到:
评论

相关推荐

    fsockopen用法.txt

    ### fsockopen函数详解 在PHP中,`fsockopen`是...通过合理使用该函数,可以轻松实现各种网络通信需求,包括HTTP请求、FTP操作等。理解其参数含义、返回值以及如何处理错误,对于开发高效可靠的网络应用程序至关重要。

    fsockopen get/post 表单及上传文件例子

    使用`fsockopen`实现GET请求,你需要构建URL,包括查询字符串,然后将数据发送到服务器。以下是一个简单的GET请求示例: ```php $url = 'http://example.com/index.php?name=value'; $host = parse_url($url, ...

    PHP实现模拟http请求的方法分析

    本文实例讲述了PHP实现模拟http请求的方法。分享给大家供大家参考,具体如下: 在http简析中,我们提到了浏览器请求资源的一个流程,那么这个流程能不能用php来模拟呢?答案是肯定的。 php模拟http请求需要实现以下...

    php伪造http头实现IP欺骗

    ##### 示例1:使用fsockopen伪造HTTP请求 ```php $fp = fsockopen("passport.baidu.com", 80, $errno, $errstr, 30); if (!$fp) { echo "$errstr($errno) \n"; } else { $msg = "GET /?login&username=...

    php使用fsockopen函数发送post,get请求获取网页内容的方法

    通过fsockopen函数实现的HTTP请求,通常需要手动处理HTTP协议的细节,所以在实际开发中,如果仅仅是发送HTTP请求获取网页内容,建议使用cURL或者HTTP流包装器等更高级的功能,它们提供了更简洁和强大的接口来处理...

    PHP构造http头发送请求.txt

    在Web开发中,发送HTTP请求是一种常见的需求。PHP作为一种广泛使用的服务器端脚本语言,提供了多种方式来构造和发送HTTP请求。本文档将详细介绍如何使用PHP来构造HTTP头部并发送请求。 #### 二、HTTP请求的基本构成...

    基于php socket(fsockopen)的应用实例分析

    使用`fsockopen`的场景广泛,它可以用于执行HTTP POST或GET请求、执行FTP操作、与其他服务器进行数据交换等。在上述例子中,我们看到如何通过Socket编程实现简单的通信,这为自定义协议或扩展现有协议提供了基础。 ...

    浅谈php中curl、fsockopen的应用

    总结来说,cURL和fsockopen都是PHP中实现HTTP请求的方法,各有优势。cURL更适合大多数情况,因为它提供了丰富的功能和便利性;而fsockopen则适用于需要更多控制权和优化性能的场景。选择哪种方法取决于具体的需求和...

    发送POST请求的三种方式的php类

    这个类中,我们首先解析URL获取主机名和路径,然后构建HTTP请求头和POST数据,最后通过fsockopen、fsockwrite和fclose操作套接字发送请求并接收响应。 总结来说,cURL是功能最全面的选择,适合复杂的HTTP请求;`...

    php异步:在php中使用fsockopen curl实现类似异步处理的功能方法

    这个函数通过构造HTTP请求头并发送,然后关闭连接,实现了快速发送请求而无需等待响应。然而,这种方法不适用于需要传递数据的情况,如果需要POST数据,可以在HTTP头中添加POST内容。 当fsockopen不可用或不适用时...

    发布一个用PHP fsockopen写的HTTP下载的类

    fsockopen是PHP中的一个函数,用于打开一个到网络服务器的套接字连接,这使得开发者可以直接处理HTTP请求,而不仅仅是获取内容。在这个特定的类中,开发者可以更灵活地处理HTTP头信息,这对于某些需要分析HTTP响应头...

    php模拟asp中的XmlHttpRequest实现http请求的代码

    在PHP中,模拟ASP中的XMLHttpRequest来实现HTTP请求是一项常见的任务,这主要涉及到网络通信和HTTP协议的理解。XMLHttpRequest在JavaScript中广泛用于实现AJAX(异步JavaScript和XML)技术,而在PHP中,我们可以创建...

    php源码 fsockopen获取网页内容实例详解

    // 准备HTTP请求头信息 $request = "GET $page HTTP/1.0\r\n"; $request .= "Host: $host\r\n"; $request .= "Referer: ***\r\n"; $request .= "User-Agent: PHP test client\r\n\r\n"; // 发送HTTP请求头信息 ...

    php发送post请求的三种方法

    其中,fsockopen()函数用于打开一个网络连接的socket,然后可以通过fwrite()函数向服务器发送HTTP请求数据,再通过fgets()函数读取响应。这种方法可以提供更底层的网络通信细节,但同时也需要程序员对网络协议有较为...

    php利用fsockopen GET/POST提交表单及上传文件

    `fsockopen`函数是PHP提供的一种低级网络通信接口,它允许开发者直接打开到TCP/IP端口的连接,从而实现HTTP的GET和POST请求。本文将详细介绍如何利用`fsockopen`进行GET和POST请求,以及如何处理文件上传。 1. GET...

    php自动提交表单的方法(基于fsockopen与curl)_.docx

    本文将详细介绍两种实现此功能的方法:fsockopen和cURL。 1. **fsockopen方法** fsockopen是PHP内置的一个网络连接函数,它可以打开到指定服务器的TCP/IP套接字连接。以下是如何使用fsockopen来实现表单自动提交的...

Global site tag (gtag.js) - Google Analytics