php 利用socket发送GET,POST请求的实例代码


Posted in PHP onJuly 04, 2020

作为php程序员一定会接触http协议,也只有深入了解http协议,编程水平才会更进一步。最近我一直在学习php的关于http的编程,许多东西恍然大悟,受益匪浅。希望分享给大家。本文需要有一定http基础的开发者阅读。

今天给大家带来的是如何利用socket发送GET,POST请求。我借用燕十八老师封装好的一个Http类给进行说明。

在日常编程中相信很多人和我一样大部分时间是利用浏览器向服务器提出GET,POST请求,那么可否利用其它方式提出GET,POST请求呢?答案必然是肯定的。了解过HTTP协议的人知道,浏览器提交请求的实质是向服务器发送一个请求信息,这个请求信息有请求行,请求头,请求体(非必须)构成。服务器根据请求信息返回一个响应信息。连接断开。

 

HTTP请求的格式如下所示:

<request-line>
 <headers>
 <blank line>
 [<request-body>]

HTTP响应的格式与请求的格式十分相似:

<status-line>
<headers>
<blank line>

[<response-body>]

我们可以利用HTTP发送请求的原理,可以重新考虑利用socket发送HTTP请求。

Socket的英文原义是“孔”或“插座”。通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。如此看来,其实利用socket操作远程文件和读写本地的文件一样容易,把本地文件看成通过硬件传输,远程文件通过网线传输就行了。

因而可以将发送请求的考虑成 建立连接->打开socket接口(fsockopen())->写入请求(fwrite())->读出响应(fread()->关闭文件(fclose())。话不多说,直接上代码:

<?php 

interface Proto {
  // 连接url
  function conn($url);

  //发送get查询
  function get();

  // 发送post查询
  function post();

  // 关闭连接
  function close();
}



class Http implements Proto {

  const CRLF = "\r\n";

  protected $errno = -1;
  protected $errstr = '';
  protected $response = '';

  protected $url = null;
  protected $version = 'HTTP/1.1';
  protected $fh = null;
  
  protected $line = array();
  protected $header = array();
  protected $body = array();

  
  public function __construct($url) {
    $this->conn($url);
    $this->setHeader('Host: ' . $this->url['host']);
  }

  // 此方法负责写请求行
  protected function setLine($method) {
    $this->line[0] = $method . ' ' . $this->url['path'] . '?' .$this->url['query'] . ' '. $this->version;
  }

  // 此方法负责写头信息
  public function setHeader($headerline) {
    $this->header[] = $headerline; 
  }

  // 此方法负责写主体信息
  protected function setBody($body) {
     $this->body[] = http_build_query($body);
  }


  // 连接url
  public function conn($url) {
    $this->url = parse_url($url);
    // 判断端口
    if(!isset($this->url['port'])) {
      $this->url['port'] = 80;
    }

    // 判断query
    if(!isset($this->url['query'])) {
      $this->url['query'] = '';
    }

    $this->fh = fsockopen($this->url['host'],$this->url['port'],$this->errno,$this->errstr,3);
  }

  //构造get请求的数据
  public function get() {
    $this->setLine('GET');
    $this->request();
    return $this->response;
  }

  // 构造post查询的数据
  public function post($body = array()) {   
    $this->setLine('POST');

    // 设计content-type
    $this->setHeader('Content-type: application/x-www-form-urlencoded');
    
    // 设计主体信息,比GET不一样的地方
    $this->setBody($body);


    // 计算content-length
    $this->setHeader('Content-length: ' . strlen($this->body[0]));

    $this->request();

    return $this->response;
  }

  // 真正请求
  public function request() {
    // 把请求行,头信息,实体信息 放在一个数组里,便于拼接
    $req = array_merge($this->line,$this->header,array(''),$this->body,array(''));
    //print_r($req);

    $req = implode(self::CRLF,$req); 
    //echo $req; exit;

    fwrite($this->fh,$req);
    
    while(!feof($this->fh)) {
      $this->response .= fread($this->fh,1024);
    }

    $this->close(); // 关闭连接
  }


  // 关闭连接
  public function close() {
    fclose($this->fh);
  }

}

      利用此类发送一个简单的GET请求:

<?php//记得引用Http类
$url="http://home.cnblogs.com/u/DeanChopper/";
$http=new Http($url);


$response=$http->get();

print_r($response);

返回值为信息,可以对响应信息进行进一步处理,得到自己想得到的内容。

以上就是php 利用socket发送GET,POST请求的实例代码的详细内容,更多关于php 发送GET,POST请求的资料请关注三水点靠木其它相关文章!

PHP 相关文章推荐
用PHP和ACCESS写聊天室(三)
Oct 09 PHP
Smarty模板快速入门
Jan 04 PHP
PHP数据集构建JSON格式及新数组的方法
Nov 07 PHP
深入PHP数据加密详解
Jun 18 PHP
PHP获取MSN好友列表类的实现代码
Jun 23 PHP
php实现斐波那契数列的简单写法
Jul 19 PHP
PHP中使用register_shutdown_function函数截获fatal error示例
Apr 21 PHP
Yii视图CGridView实现操作按钮定义地址示例
Jul 14 PHP
thinkphp配置文件路径的实现方法
Aug 30 PHP
PHP页面输出时js设置input框的选中值
Sep 30 PHP
Discuz论坛密码与密保加密规则
Dec 19 PHP
PHP Trait功能与用法实例分析
Jun 03 PHP
PHP实现递归的三种方法
Jul 04 #PHP
laravel开发环境homestead搭建过程详解
Jul 03 #PHP
PHP7原生MySQL数据库操作实现代码
Jul 03 #PHP
PHP 超级全局变量相关总结
Jun 30 #PHP
详细分析PHP 命名空间(namespace)
Jun 30 #PHP
浅析PHP echo 和 print 语句
Jun 30 #PHP
PHP实现抽奖功能实例代码
Jun 30 #PHP
You might like
PHP 表单提交给自己
2008/07/24 PHP
php cookie使用方法学习笔记分享
2013/11/07 PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
2014/04/29 PHP
php截取html字符串及自动补全html标签的方法
2015/01/15 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
Stop SQL Server
2007/06/21 Javascript
读jQuery之十四 (触发事件核心方法)
2011/08/23 Javascript
MyEclipse取消验证Js的两种方法
2013/11/14 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
2013/12/19 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
省市区三级联动jquery实现代码
2020/04/15 Javascript
jquery checkbox的相关操作总结
2016/10/17 Javascript
利用Node.JS实现邮件发送功能
2016/10/21 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
2016/12/26 Javascript
jQuery Masonry瀑布流插件使用方法详解
2017/01/18 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
Javascript操作dom对象之select全面解析
2017/04/24 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
javascript计算对象长度的方法
2017/10/25 Javascript
JS实现利用两个队列表示一个栈的方法
2017/12/13 Javascript
微信小程序官方动态自定义底部tabBar的例子
2019/09/04 Javascript
[01:56]林书豪DOTA2上海特级锦标赛励志短片
2016/03/05 DOTA
Python单元测试框架unittest使用方法讲解
2015/04/13 Python
Python定时执行之Timer用法示例
2015/05/27 Python
Python实现数通设备端口使用情况监控实例
2015/07/15 Python
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
python数据类型_字符串常用操作(详解)
2017/05/30 Python
Python搭建HTTP服务过程图解
2019/12/14 Python
Windows下pycharm安装第三方库失败(通用解决方案)
2020/09/17 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
家具厂厂长岗位职责
2014/01/01 职场文书
关于环保的建议书
2014/05/12 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
委托书的样本
2015/01/28 职场文书
GoLang中生成UUID唯一标识的实现
2021/05/08 Golang