当前位置: 首页 > news >正文

form-data php,php HTTP请求类(支持GET,POST,Multipart/form-data)

本节内容

PHP HTTP请求类,支持GET,POST,Multipart/form-data。

1,HTTP请求类 HttpRequest.class.php

复制代码 代码示例:

/** HttpRequest class, HTTP请求类,支持GET,POST,Multipart/form-data

*   Date:   2013-09-25

*   Author: fdipzone

*   Ver:    1.0

*   Edit: www.jbxue.com

*   Func:

*   public  setConfig     设置连接参数

*   public  setFormdata   设置表单数据

*   public  setFiledata   设置文件数据

*   public  send          发送数据

*   private connect       创建连接

*   private disconnect    断开连接

*   private sendGet       get 方式,处理发送的数据,不会处理文件数据

*   private sendPost      post 方式,处理发送的数据

*   private sendMultipart multipart 方式,处理发送的数据,发送文件推荐使用此方式

*/

class HttpRequest{ // class start

private $_ip = '';

private $_host = '';

private $_url = '';

private $_port = '';

private $_errno = '';

private $_errstr = '';

private $_timeout = 15;

private $_fp = null;

private $_formdata = array();

private $_filedata = array();

// 设置连接参数

public function setConfig($config){

$this->_ip = isset($config['ip'])? $config['ip'] : '';

$this->_host = isset($config['host'])? $config['host'] : '';

$this->_url = isset($config['url'])? $config['url'] : '';

$this->_port = isset($config['port'])? $config['port'] : '';

$this->_errno = isset($config['errno'])? $config['errno'] : '';

$this->_errstr = isset($config['errstr'])? $config['errstr'] : '';

$this->_timeout = isset($confg['timeout'])? $confg['timeout'] : 15;

// 如没有设置ip,则用host代替

if($this->_ip==''){

$this->_ip = $this->_host;

}

}

// 设置表单数据

public function setFormData($formdata=array()){

$this->_formdata = $formdata;

}

// 设置文件数据

public function setFileData($filedata=array()){

$this->_filedata = $filedata;

}

// 发送数据

public function send($type='get'){

$type = strtolower($type);

// 检查发送类型

if(!in_array($type, array('get','post','multipart'))){

return false;

}

// 检查连接

if($this->connect()){

switch($type){

case 'get':

$out = $this->sendGet();

break;

case 'post':

$out = $this->sendPost();

break;

case 'multipart':

$out = $this->sendMultipart();

break;

}

// 空数据

if(!$out){

return false;

}

// 发送数据

fputs($this->_fp, $out);

// 读取返回数据

$response = '';

while($row = fread($this->_fp, 4096)){

$response .= $row;

}

// 断开连接

$this->disconnect();

$pos = strpos($response, "\r\n\r\n");

$response = substr($response, $pos+4);

return $response;

}else{

return false;

}

}

// 创建连接

private function connect(){

$this->_fp = fsockopen($this->_ip, $this->_port, $this->_errno, $this->_errstr, $this->_timeout);

if(!$this->_fp){

return false;

}

return true;

}

// 断开连接

private function disconnect(){

if($this->_fp!=null){

fclose($this->_fp);

$this->_fp = null;

}

}

// get 方式,处理发送的数据,不会处理文件数据

private function sendGet(){

// 检查是否空数据

if(!$this->_formdata){

return false;

}

// 处理url

$url = $this->_url.'?'.http_build_query($this->_formdata);

$out = "GET ".$url." http/1.1\r\n";

$out .= "host: ".$this->_host."\r\n";

$out .= "connection: close\r\n\r\n";

return $out;

}

// post 方式,处理发送的数据

private function sendPost(){

// 检查是否空数据

if(!$this->_formdata && !$this->_filedata){

return false;

}

// form data

$data = $this->_formdata? $this->_formdata : array();

// file data

if($this->_filedata){

foreach($this->_filedata as $filedata){

if(file_exists($filedata['path'])){

$data[$filedata['name']] = file_get_contents($filedata['path']);

}

}

}

if(!$data){

return false;

}

$data = http_build_query($data);

$out = "POST ".$this->_url." http/1.1\r\n";

$out .= "host: ".$this->_host."\r\n";

$out .= "content-type: application/x-www-form-urlencoded\r\n";

$out .= "content-length: ".strlen($data)."\r\n";

$out .= "connection: close\r\n\r\n";

$out .= $data;

return $out;

}

// multipart 方式,处理发送的数据,发送文件推荐使用此方式

private function sendMultipart(){

// 检查是否空数据

if(!$this->_formdata && !$this->_filedata){

return false;

}

// 设置分割标识

srand((double)microtime()*1000000);

$boundary = '---------------------------'.substr(md5(rand(0,32000)),0,10);

$data = '--'.$boundary."\r\n";

// form data

$formdata = '';

foreach($this->_formdata as $key=>$val){

$formdata .= "content-disposition: form-data; name=\"".$key."\"\r\n";

$formdata .= "content-type: text/plain\r\n\r\n";

if(is_array($val)){

$formdata .= json_encode($val)."\r\n"; // 数组使用json encode后方便处理

}else{

$formdata .= rawurlencode($val)."\r\n";

}

$formdata .= '--'.$boundary."\r\n";

}

// file data

$filedata = '';

foreach($this->_filedata as $val){

if(file_exists($val['path'])){

$filedata .= "content-disposition: form-data; name=\"".$val['name']."\"; filename=\"".$val['filename']."\"\r\n";

$filedata .= "content-type: ".mime_content_type($val['path'])."\r\n\r\n";

$filedata .= implode('', file($val['path']))."\r\n";

$filedata .= '--'.$boundary."\r\n";

}

}

if(!$formdata && !$filedata){

return false;

}

$data .= $formdata.$filedata."--\r\n\r\n";

$out = "POST ".$this->_url." http/1.1\r\n";

$out .= "host: ".$this->_host."\r\n";

$out .= "content-type: multipart/form-data; boundary=".$boundary."\r\n";

$out .= "content-length: ".strlen($data)."\r\n";

$out .= "connection: close\r\n\r\n";

$out .= $data;

return $out;

}

} // class end

?>

2,演示代码

复制代码 代码示例:

require('HttpRequest.class.php');

$config = array(

'ip' => 'demo.fdipzone.com', // 如空则用host代替

'host' => 'demo.fdipzone.com',

'port' => 80,

'errno' => '',

'errstr' => '',

'timeout' => 30,

'url' => '/getapi.php',

//'url' => '/postapi.php',

//'url' => '/multipart.php'

);

$formdata = array(

'name' => 'fdipzone',

'gender' => 'man'

);

$filedata = array(

array(

'name' => 'photo',

'filename' => 'photo.jpg',

'path' => 'photo.jpg'

)

);

$obj = new HttpRequest();

$obj->setConfig($config);

$obj->setFormData($formdata);

$obj->setFileData($filedata);

$result = $obj->send('get');

//$result = $obj->send('post');

//$result = $obj->send('multipart');

echo '

';

print_r($result);

echo '

';

?>

附,PHP HTTP请求类的源代码下载地址

相关文章:

  • php页眉,如何在php中创建Word文档页眉/页脚
  • 程序员角度的锁--乐观锁、悲观锁
  • msf生成php,MSF-Shellcode生成和使用
  • 如何在首次启动 Linux 虚拟机时对其进行自定义
  • php 比nodejs 容易学,粗大事了:花两天时间学习了 Go 语言,发现比 Node.js 高不知多少去了...
  • php获取cname解析结果,如何检测来自CNAME子域的传入请求(使用PHP脚本)?
  • Ubuntu16.04系统中Nmon的安装
  • CentOS 7 网络磁盘挂载到本地 并测试传输速度
  • 数字图像处理灰度变换java,数字图像处理:图像的灰度变换(Matlab实现)
  • java math 最大,在Java.lang包的Math类中,求最大值的方法为(选一项)
  • 递推算法
  • java方法传递对象,java面向对象-3-方法参数传递
  • iOS 对UIAlertController内的输入框进行输入监听,实时改变确定、取消按钮颜色
  • php url别名,编写PHP程序实现Drupal中pathauto模块的批量生成URL别名(Alias)
  • Spark记录-spark与storm比对与选型(转载)
  • Bootstrap JS插件Alert源码分析
  • CEF与代理
  • CSS魔法堂:Absolute Positioning就这个样
  •  D - 粉碎叛乱F - 其他起义
  • ES6--对象的扩展
  • export和import的用法总结
  • extjs4学习之配置
  • HTML-表单
  • Java Agent 学习笔记
  • Java读取Properties文件的六种方法
  • Linux Process Manage
  • Netty 4.1 源代码学习:线程模型
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • SQLServer插入数据
  • ViewService——一种保证客户端与服务端同步的方法
  • vue-cli3搭建项目
  • Yii源码解读-服务定位器(Service Locator)
  • 老板让我十分钟上手nx-admin
  • 类orAPI - 收藏集 - 掘金
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 项目实战-Api的解决方案
  • 自制字幕遮挡器
  • No resource identifier found for attribute,RxJava之zip操作符
  • MPAndroidChart 教程:Y轴 YAxis
  • postgresql行列转换函数
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #100天计划# 2013年9月29日
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • $NOIp2018$劝退记
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (第61天)多租户架构(CDB/PDB)
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (三)docker:Dockerfile构建容器运行jar包
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)大型网站架构演变和知识体系
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .bat批处理(四):路径相关%cd%和%~dp0的区别