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函数
Dec 06 PHP
[原创]效率较高的php下读取文本文件的代码
Jul 02 PHP
php fckeditor 调用的函数
Jun 21 PHP
ThinkPHP查询中的魔术方法简述
Jun 25 PHP
php采用file_get_contents代替使用curl实例
Nov 07 PHP
php清除和销毁session的方法分析
Mar 19 PHP
PHP递归创建多级目录
Nov 05 PHP
实现PHP框架系列文章(6)mysql数据库方法
Mar 04 PHP
php 使用fopen函数创建、打开文件详解及实例代码
Sep 24 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
Jul 03 PHP
PHP 使用二进制保存用户状态的实例
Jan 29 PHP
php查询内存信息操作示例
May 09 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目录操作实例代码
2014/02/21 PHP
php顺序查找和二分查找示例
2014/03/27 PHP
ThinkPHP中数据操作案例分析
2015/09/27 PHP
浅谈mysql_query()函数的返回值问题
2016/09/05 PHP
PHP单例模式数据库连接类与页面静态化实现方法
2019/03/20 PHP
JavaScript DOM 学习第五章 表单简介
2010/02/19 Javascript
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
2011/07/08 Javascript
两种方法实现在HTML页面加载完毕后运行某个js
2014/06/16 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
2014/08/15 Javascript
JQuery实现展开关闭层的方法
2015/02/17 Javascript
举例简介AngularJS的内部语言环境
2015/06/17 Javascript
jquery动态导航插件dynamicNav用法实例分析
2015/09/06 Javascript
js 获取范围内的随机数实例代码
2016/08/02 Javascript
jquery心形点赞关注效果的简单实现
2016/11/14 Javascript
JavaScript实现的XML与JSON互转功能详解
2017/02/16 Javascript
jQuery简单实现根据日期计算星期几的方法
2019/01/09 jQuery
优化Vue项目编译文件大小的方法步骤
2019/05/27 Javascript
Vue3.0中的monorepo管理模式的实现
2019/10/14 Javascript
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
python中验证码连通域分割的方法详解
2018/06/04 Python
解决python中导入win32com.client出错的问题
2019/07/26 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
python实现学生管理系统开发
2020/07/24 Python
python 基于selectors库实现文件上传与下载
2020/12/31 Python
Under Armour安德玛法国官网:美国高端运动科技品牌
2018/06/29 全球购物
电子商务专业个人的自我评价
2013/12/19 职场文书
八年级美术教学反思
2014/02/02 职场文书
入学申请自荐信范文
2014/02/26 职场文书
教师三严三实心得体会
2014/10/11 职场文书
2016年5月份红领巾广播稿
2015/12/21 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
低端且暴利的线上线下创业项目分享
2019/09/03 职场文书
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
2022/08/05 Servers