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 相关文章推荐
function.inc.php超越php
Dec 09 PHP
PHP集成FCK的函数代码
Sep 27 PHP
PHP日期处理函数 整型日期格式
Jan 12 PHP
细谈php中SQL注入攻击与XSS攻击
Jun 10 PHP
php插入中文到sqlserver 2008里出现乱码的解决办法分享
Jul 19 PHP
PHP实现指定字段的多维数组排序函数分享
Mar 09 PHP
PHP生成json和xml类型接口数据格式
May 17 PHP
在Mac上编译安装PHP7的开发环境
Jul 28 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
May 13 PHP
laravel5.4生成验证码的实例讲解
Aug 05 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
Oct 01 PHP
PHP 图片处理
Sep 16 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+APACHE实现用户论证的方法
2006/10/09 PHP
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
JavaScript中for..in循环陷阱介绍
2013/11/12 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
解析页面加载与js函数的执行 onload or ready
2013/12/12 Javascript
推荐一个封装好的getElementsByClassName方法
2014/12/02 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
jQuery插件slicebox实现3D动画图片轮播切换特效
2015/04/12 Javascript
JavaScript中操作字符串小结
2015/05/04 Javascript
用window.onerror捕获并上报Js错误的方法
2016/01/27 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
2016/03/07 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
nodejs 最新版安装npm 的使用详解
2018/01/18 NodeJs
vue+SSM实现验证码功能
2018/12/07 Javascript
分析Python的Django框架的运行方式及处理流程
2015/04/08 Python
Python使用MONGODB入门实例
2015/05/11 Python
解读Python编程中的命名空间与作用域
2015/10/16 Python
python线程池(threadpool)模块使用笔记详解
2017/11/17 Python
python3下实现搜狗AI API的代码示例
2018/04/10 Python
python调用c++ ctype list传数组或者返回数组的方法
2019/02/13 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
美国百货齐全的精品网站,提供美式风格的产品:Overstock.com
2016/07/22 全球购物
IGK Hair官网:喷雾、洗发水、护发素等
2020/11/03 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
工商学院毕业生个人自我评价
2013/09/19 职场文书
运动会入场词50字
2014/02/20 职场文书
2015年元旦文艺汇演主持词
2014/03/26 职场文书
2014年财务经理工作总结
2014/12/08 职场文书