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 相关文章推荐
PHP5中使用PDO连接数据库的方法
Aug 01 PHP
php curl基本操作详解
Jul 23 PHP
PHP怎么实现网站保存快捷方式方便用户随时浏览
Aug 15 PHP
thinkphp实现图片上传功能分享
Mar 04 PHP
typecho插件编写教程(三):保存配置
May 28 PHP
提交表单后 PHP获取提交内容的实现方法
May 25 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
Jun 13 PHP
php实现登陆模块功能示例
Oct 20 PHP
PHP中的多种加密技术及代码示例解析
Oct 20 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
PHP7新功能总结
Apr 14 PHP
laravel 使用auth编写登录的方法
Sep 30 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
星际争霸秘籍
2020/03/04 星际争霸
7个超级实用的PHP代码片段
2011/07/11 PHP
simplehtmldom Doc api帮助文档
2012/03/26 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
2020/04/27 PHP
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
2013/01/11 Javascript
使用jQuery同时控制四张图片的伸缩实现代码
2013/04/19 Javascript
JavaScript 创建运动框架的实现代码
2013/05/08 Javascript
javascript复制粘贴与clipboardData的使用
2014/10/16 Javascript
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
Jquery中find与each方法用法实例
2015/02/04 Javascript
AngularJS初始化静态模板详解
2016/01/14 Javascript
javascript作用域链与执行环境详解
2017/03/25 Javascript
js断点调试心得分享(必看篇)
2017/12/08 Javascript
使用vue 国际化i18n 实现多实现语言切换功能
2018/10/11 Javascript
环形加载进度条封装(Vue插件版和原生js版)
2019/12/04 Javascript
[00:27]DOTA2战队VP、Secret贺新春
2018/02/11 DOTA
python微信跳一跳系列之自动计算跳一跳距离
2018/02/26 Python
linux安装Python3.4.2的操作方法
2018/09/28 Python
python脚本当作Linux中的服务启动实现方法
2019/06/28 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
2012/12/28 HTML / CSS
5分钟弄清楚html5的drag and drop(小结)
2019/04/10 HTML / CSS
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
Myprotein意大利官网:欧洲第一运动营养品牌
2018/11/22 全球购物
可靠的数据流传输TCP
2016/03/15 面试题
与UNIX有关的几个名词
2015/09/17 面试题
诚信考试承诺书
2014/03/27 职场文书
情况说明书格式范文
2014/05/06 职场文书
小学生母亲节演讲稿
2014/05/07 职场文书
雷人标语集锦
2014/06/19 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
甲午大海战观后感
2015/06/02 职场文书
运动会宣传语
2015/07/13 职场文书
2016年幼儿园教研活动总结
2016/04/05 职场文书