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 相关文章推荐
第六节--访问属性和方法
Nov 16 PHP
PHP 日期时间函数的高级应用技巧
Oct 10 PHP
ThinkPHP采用原生query实现关联查询left join实例
Dec 02 PHP
php上传图片并压缩的实现方法
Dec 22 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
Dec 30 PHP
twig里使用js变量的方法
Feb 05 PHP
PHP序列化/对象注入漏洞分析
Apr 18 PHP
Yii2创建控制器(createController)方法详解
Jul 23 PHP
你不知道的文件上传漏洞php代码分析
Sep 29 PHP
简单谈谈 php 文件锁
Feb 19 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
Apr 10 PHP
PHP PDO和消息队列的个人理解与应用实例分析
Nov 25 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中Object对象的笔记分享
2011/06/28 PHP
如何判断php数组的维度
2013/06/10 PHP
php常用ODBC函数集(详细)
2013/06/24 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
Smarty中的注释和截断功能介绍
2015/04/09 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2020/01/22 PHP
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
JavaScript 对象模型 执行模型
2009/12/06 Javascript
12个非常有创意的JavaScript小游戏
2010/03/18 Javascript
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
Google 地图事件实例讲解
2016/08/06 Javascript
微信小程序(应用号)简单实例应用及实例详解
2016/09/26 Javascript
Angularjs 依赖压缩及自定义过滤器写法
2017/02/04 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
angular过滤器实现排序功能
2017/06/27 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
koa-passport实现本地验证的方法示例
2020/02/20 Javascript
[01:28]2014DOTA2国际邀请赛中国区预选赛四大豪门直升机抵达会场
2014/05/24 DOTA
python如何压缩新文件到已有ZIP文件
2018/03/14 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
在双python下设置python3为默认的方法
2018/10/31 Python
Python倒排索引之查找包含某主题或单词的文件
2019/11/13 Python
python Qt5实现窗体跟踪鼠标移动
2019/12/13 Python
Python select及selectors模块概念用法详解
2020/06/22 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
区域销售主管岗位职责
2014/06/15 职场文书
2014年财务工作自我评价
2014/09/23 职场文书
社区党员干部承诺书
2015/05/04 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书
幼儿园教师教学反思
2016/03/02 职场文书
入党转正申请自我鉴定
2019/06/25 职场文书
【HBU】数据库第四周 单表查询
2021/04/05 SQL Server
java如何实现socket连接方法封装
2021/09/25 Java/Android
PostgreSQL自动更新时间戳实例代码
2021/11/27 PostgreSQL
Win11 21h2可以升级22h2吗?看看你的电脑符不符合要求
2022/07/07 数码科技
Python软件包安装的三种常见方法
2022/07/07 Python