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之数据库操作详解及乱码解决!
Jan 02 PHP
PHP开发中常用的字符串操作函数
Feb 08 PHP
php stripslashes和addslashes的区别
Feb 03 PHP
dvwa+xampp搭建显示乱码的问题及解决方案
Aug 23 PHP
php结合mysql与mysqli扩展处理事务的方法
Jun 29 PHP
PHP入门教程之会话控制技巧(cookie与session)
Sep 11 PHP
PHP实现mysqli批量执行多条语句的方法示例
Jul 22 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
PHP+ajax实现二级联动菜单功能示例
Aug 10 PHP
实例介绍PHP中zip_open()函数用法
Feb 15 PHP
PHP抽象类与接口的区别详解
Mar 21 PHP
Yii中特殊行为ActionFilter的使用方法示例
Oct 18 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中10个不常见却非常有用的函数
2010/03/21 PHP
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
2013/06/26 PHP
两种php给图片加水印的实现代码
2020/04/18 PHP
PHP模板引擎Smarty中的保留变量用法分析
2016/04/11 PHP
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
php 二维数组快速排序算法的实现代码
2017/10/17 PHP
基于SVG的web页面图形绘制API介绍及编程演示
2013/06/28 Javascript
javascript创建和存储cookie示例
2014/01/07 Javascript
jquery表单验证插件(jquery.validate.js)的3种使用方式
2015/03/28 Javascript
百度地图JavascriptApi Marker平滑移动及车头指向行径方向
2017/03/13 Javascript
微信小程序之购物车功能
2020/09/23 Javascript
基于bootstrop常用类总结(推荐)
2017/09/11 Javascript
Angular实现模版驱动表单的自定义校验功能(密码确认为例)
2018/05/17 Javascript
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
在vue项目中引入高德地图及其UI组件的方法
2018/09/04 Javascript
js实现右键弹出自定义菜单
2020/09/08 Javascript
js实现三角形粒子运动
2020/09/22 Javascript
python登陆asp网站页面的实现代码
2015/01/14 Python
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
python实现决策树ID3算法的示例代码
2018/05/30 Python
对Python中实现两个数的值交换的集中方法详解
2019/01/11 Python
django自带调试服务器的使用详解
2019/08/29 Python
Django获取应用下的所有models的例子
2019/08/30 Python
python实现飞行棋游戏
2020/02/05 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
2020/07/14 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
2020/09/03 Python
canvas学习笔记之绘制简单路径
2019/01/28 HTML / CSS
法国滑雪假期的专家:Ski Planet
2019/11/02 全球购物
解释一下抽象方法和抽象类
2016/08/27 面试题
揠苗助长教学反思
2014/02/04 职场文书
工程质量月活动方案
2014/02/19 职场文书
物业工程部岗位职责
2015/02/11 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
《黄山奇石》教学反思
2016/02/18 职场文书
python爬虫框架feapde的使用简介
2021/04/20 Python