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 相关文章推荐
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
Nov 21 PHP
php转换颜色为其反色的方法
Apr 27 PHP
详解PHP中的状态模式编程
Aug 11 PHP
php获取汉字拼音首字母的方法
Oct 21 PHP
php表单提交实例讲解
Nov 12 PHP
在WordPress中使用wp-cron插件来设置定时任务
Dec 10 PHP
ThinkPHP的常用配置选项汇总
Mar 24 PHP
laravel5.5添加echarts实现画图功能的方法
Oct 09 PHP
php 使用expat方式解析xml文件操作示例
Nov 26 PHP
Laravel5.1框架路由分组用法实例分析
Jan 04 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
Mar 02 PHP
PHP底层运行机制与工作原理详解
Jul 31 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
详解:――如何将图片储存在数据库里
2006/12/05 PHP
php adodb连接mssql解决乱码问题
2009/06/12 PHP
php 定义404页面的实现代码
2012/11/19 PHP
JS Pro-深入面向对象的程序设计之继承的详解
2013/05/07 Javascript
jquery实现点击页面计算点击次数
2015/01/23 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
详解vue-router 2.0 常用基础知识点之导航钩子
2017/05/10 Javascript
探究react-native 源码的图片缓存问题
2017/08/24 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
2018/04/28 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
2019/03/29 Javascript
[49:21]TNC vs VG 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第三场 8.20.mp4
2019/08/22 DOTA
python爬取NUS-WIDE数据库图片
2016/10/05 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
2017/07/25 Python
Python中对象的引用与复制代码示例
2017/12/04 Python
python实现指定字符串补全空格、前面填充0的方法
2018/11/16 Python
详解python播放音频的三种方法
2019/09/23 Python
python是否适合网页编程详解
2019/10/04 Python
Python如何使用Gitlab API实现批量的合并分支
2019/11/27 Python
Pytorch之view及view_as使用详解
2019/12/31 Python
什么是Python中的匿名函数
2020/06/02 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
2020/06/28 Python
Python实现迪杰斯特拉算法过程解析
2020/09/18 Python
pandas处理csv文件的方法步骤
2020/10/16 Python
机电一体化大学生求职信
2013/11/08 职场文书
优秀求职信范文分享
2014/01/26 职场文书
保护环境倡议书500字
2014/05/19 职场文书
学校运动会霸气口号
2014/06/07 职场文书
稽核岗位职责范本
2015/04/13 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
学历证明样本
2015/06/16 职场文书
2016大一新生军训感言
2015/12/08 职场文书
节约用水广告语60条
2019/11/14 职场文书
CSS SandBox应用场景及常见问题
2022/06/25 HTML / CSS