PHP模拟post提交数据方法汇总


Posted in PHP onFebruary 16, 2016

使用php模拟post传值虽然在日常生活中用到的不是很多,但是在某些场合还是经常用到的。下面三水点靠木小编给大家整理了三种php模拟post传值的方法,file_get_contents、curl和socket。

第一种:file_get_contents来模拟post

<php

function file_get_contents_post($url, $post){
$options = array(
‘http‘=> array(
‘method‘=>‘POST‘,
‘content‘=> http_build_query($post),
),
);
$result = file_get_contents($url,false, stream_context_create($options));
return $result;
}
$data = file_get_contents_post("http://www.a.com/post/post.php", array(‘name‘=>‘caiknife‘,‘email‘=>‘caiknife#gmail.com‘));
var_dump($data);

第二种:curl模拟post

<php
function curl_post($url, $post){
$options = array(
CURLOPT_RETURNTRANSFER =>true,
CURLOPT_HEADER =>false,
CURLOPT_POST =>true,
CURLOPT_POSTFIELDS => $post,
);
$ch = curl_init($url);
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
$data = curl_post("http://www.a.com/post/post.php", array(‘name‘=>‘caiknife‘,‘email‘=>‘caiknife#gmail.com‘));
var_dump($data);

第三种:socket来模拟post

<php
function socket_post($url, $post){
$urls = parse_url($url);
if(!isset($urls[‘port‘])){
$urls[‘port‘]=80;
}
$fp = fsockopen($urls[‘host‘], $urls[‘port‘], $errno, $errstr);
if(!$fp){
echo "$errno, $errstr";
exit();
}
$post = http_build_query($post);
$length = strlen($post);
$header =<<<HEADER
<span class="Apple-tab-span" style="white-space:pre"></span>POST {$urls[‘path‘]} HTTP/1.1
<span class="Apple-tab-span" style="white-space:pre"></span>Host:{$urls[‘host‘]}
<span class="Apple-tab-span" style="white-space:pre"></span>Content-Type: application/x-www-form-urlencoded
<span class="Apple-tab-span" style="white-space:pre"></span>Content-Length:{$length}
<span class="Apple-tab-span" style="white-space:pre"></span>Connection: close
<span class="Apple-tab-span" style="white-space:pre"></span>{$post}
<span class="Apple-tab-span" style="white-space:pre"></span>HEADER;
fwrite($fp, $header);
$result =‘‘;
while(!feof($fp)){
$result .= fread($fp,512);
}
$result = explode("\r\n\r\n", $result,2);
return $result[1];
}
$data = socket_post("http://www.a.com/post/post.php", array(‘name‘=>‘caiknife‘,‘email‘=>‘caiknife#gmail.com‘));
var_dump($data);

上面这三种方法最后看到的内容都是一样的,都可以得到post的传值;但是在是用socket的时候,发送header信息时必须要注意header的完整信息,比如content type和content length必须要有,connection: close和post数据之间要空一行,等等;而通过socket取得的内容是包含了header信息的,要处理一下才能获得真正的内容。

下面给大家说下php模拟post提交请求,调用接口

/**
* 模拟post进行url请求
* @param string $url
* @param string $param
*/
function request_post($url = '', $param = '') {
if (empty($url) || empty($param)) {
return false;
}
$postUrl = $url;
$curlPost = $param;
$ch = curl_init();//初始化curl
curl_setopt($ch, CURLOPT_URL,$postUrl);//抓取指定网页
curl_setopt($ch, CURLOPT_HEADER, 0);//设置header
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
$data = curl_exec($ch);//运行curl
curl_close($ch);
return $data;
}

这是方法,

下面是具体的调用案例。

function testAction(){
$url = 'http://mobile.jschina.com.cn/jschina/register.php';
$post_data['appid'] = '10';
$post_data['appkey'] = 'cmbohpffXVR03nIpkkQXaAA1Vf5nO4nQ';
$post_data['member_name'] = 'zsjs123';
$post_data['password'] = '123456';
$post_data['email'] = 'zsjs123@126.com';
$o = "";
foreach ( $post_data as $k => $v ) 
{ 
$o.= "$k=" . urlencode( $v ). "&" ;
}
$post_data = substr($o,0,-1);
$res = $this->request_post($url, $post_data); 
print_r($res);
}

这样就提交请求,并且获取请求结果了。一般返回的结果是json格式的。

这里的post是拼接出来的。

也可以改造成下面的方式。

/**
* 模拟post进行url请求
* @param string $url
* @param array $post_data
*/
function request_post($url = '', $post_data = array()) {
if (empty($url) || empty($post_data)) {
return false;
}
$o = "";
foreach ( $post_data as $k => $v ) 
{ 
$o.= "$k=" . urlencode( $v ). "&" ;
}
$post_data = substr($o,0,-1);
$postUrl = $url;
$curlPost = $post_data;
$ch = curl_init();//初始化curl
curl_setopt($ch, CURLOPT_URL,$postUrl);//抓取指定网页
curl_setopt($ch, CURLOPT_HEADER, 0);//设置header
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
$data = curl_exec($ch);//运行curl
curl_close($ch);
return $data;
}

将拼接也封装了起来,这样调用的时候就更简洁了。

function testAction(){
$url = 'http://mobile.jschina.com.cn/jschina/register.php';
$post_data['appid'] = '10';
$post_data['appkey'] = 'cmbohpffXVR03nIpkkQXaAA1Vf5nO4nQ';
$post_data['member_name'] = 'zsjs124';
$post_data['password'] = '123456';
$post_data['email'] = 'zsjs124@126.com';
//$post_data = array();
$res = $this->request_post($url, $post_data); 
print_r($res);
}
PHP 相关文章推荐
php mssql 分页SQL语句优化 持续影响
Apr 26 PHP
用PHP实现递归循环每一个目录
Aug 08 PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
Dec 05 PHP
php的POSIX 函数以及进程测试的深入分析
Jun 03 PHP
解析php 版获取重定向后的地址(代码)
Jun 26 PHP
PHP怎样用正则抓取页面中的网址
Aug 09 PHP
php die()与exit()的区别实例详解
Dec 03 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
Feb 11 PHP
Yii2.0框架模型多表关联查询示例
Jul 18 PHP
使用Laravel中的查询构造器实现增删改查功能
Sep 03 PHP
PHP 时间处理类Carbon
May 20 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
Feb 16 #PHP
PHP的Yii框架入门使用教程
Feb 15 #PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
Feb 15 #PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
Feb 15 #PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
Feb 15 #PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
Feb 15 #PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
Feb 15 #PHP
You might like
PHP mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
php实现快速排序的三种方法分享
2014/03/12 PHP
PHP zip扩展Linux下安装过程分享
2014/05/05 PHP
PHP中的Session对象如何使用
2015/09/25 PHP
浅谈php中fopen不能创建中文文件名文件的问题
2017/02/06 PHP
提高jQuery性能的十个诀窍
2013/11/14 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
2015/02/05 Javascript
JavaScript基础篇(6)之函数表达式闭包
2015/12/11 Javascript
JS实现倒计时(天数、时、分、秒)
2016/11/16 Javascript
基本DOM节点操作
2017/01/17 Javascript
微信小程序渲染性能调优小结
2019/07/30 Javascript
如何在Node和浏览器控制台中打印彩色文字
2020/01/09 Javascript
[01:46]2018完美盛典章节片——坚守
2018/12/17 DOTA
python实现图片批量剪切示例
2014/03/25 Python
Python3.2模拟实现webqq登录
2016/02/15 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
python bmp转换为jpg 并删除原图的方法
2018/10/25 Python
简单了解django缓存方式及配置
2019/07/19 Python
Django用户身份验证完成示例代码
2020/04/03 Python
Python Json数据文件操作原理解析
2020/05/09 Python
canvas版人体时钟的实现示例
2021/01/29 HTML / CSS
Linux如何压缩可执行文件
2013/10/21 面试题
双十佳事迹材料
2014/01/29 职场文书
三下乡活动方案
2014/01/31 职场文书
《会变的花树叶》教学反思
2014/02/10 职场文书
村安全生产责任书
2014/08/25 职场文书
党员群众路线对照检查材料
2014/08/31 职场文书
全国爱眼日活动总结
2015/02/27 职场文书
2015年禁毒宣传活动总结
2015/03/25 职场文书
2016形势与政策学习心得体会
2016/01/12 职场文书
Angular CLI发布路径的配置项浅析
2021/03/29 Javascript
MySQL命令无法输入中文问题的解决方式
2021/08/30 MySQL
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python
SQL Server数据库备份和恢复数据库的全过程
2022/06/14 SQL Server
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL