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_Flame(Version:Progress)的原代码
Oct 09 PHP
php中var_export与var_dump的区别分析
Aug 21 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
Feb 19 PHP
PHP通过session id 实现session共享和登录验证的代码
Jun 03 PHP
PHP抽象类 介绍
Jun 13 PHP
Php中文件下载功能实现超详细流程分析
Jun 13 PHP
解析php函数method_exists()与is_callable()的区别
Jun 21 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
Nov 18 PHP
ThinkPHP开发--使用七牛云储存
Sep 14 PHP
Laravel中为什么不使用blpop取队列详析
Aug 01 PHP
PHP的mysqli_stmt_init()函数讲解
Jan 24 PHP
Laravel 修改默认日志文件名称和位置的例子
Oct 17 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/11/16 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
PHP 观察者模式深入理解与应用分析
2019/09/25 PHP
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
jquery实现动态菜单的实例代码
2013/11/28 Javascript
jQuery动态背景图片效果实现方法
2015/07/03 Javascript
javascript实现下拉提示选择框
2015/12/29 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
超链接怎么正确调用javascript函数
2016/05/23 Javascript
Vue.js开发环境快速搭建教程
2017/03/17 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
jQuery中过滤器的基本用法示例
2017/10/11 jQuery
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
浅谈vue中改elementUI默认样式引发的static与assets的区别
2018/02/03 Javascript
Nodejs调用Dll模块的方法
2018/09/17 NodeJs
在微信小程序中渲染HTML内容的方法示例
2018/09/28 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
JavaScript工具库之Lodash详解
2019/06/15 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
jQuery实现数字华容道小游戏(实例代码)
2020/01/16 jQuery
js cavans实现静态滚动弹幕
2020/05/21 Javascript
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
Python中的二维数组实例(list与numpy.array)
2018/04/13 Python
Python计算不规则图形面积算法实现解析
2019/11/22 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
Python实现在Windows平台修改文件属性
2020/03/05 Python
百度软件工程师职位
2013/02/14 面试题
金属材料工程个人求职的自我评价
2013/12/04 职场文书
煤矿班组长岗位职责
2013/12/29 职场文书
肯尼迪就职演说稿
2013/12/31 职场文书
《小猫刮胡子》教学反思
2014/02/21 职场文书
环境整治工作方案
2014/05/18 职场文书
班主任工作经验交流会总结
2015/11/02 职场文书