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 相关文章推荐
一个连接两个不同MYSQL数据库的PHP程序
Oct 09 PHP
mysql 字段类型说明
Apr 27 PHP
深入php常用函数的使用汇总
Jun 08 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
Jun 25 PHP
用php简单实现加减乘除计算器
Jan 06 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
Jun 17 PHP
thinkPHP实现将excel导入到数据库中的方法
Apr 22 PHP
用PHP写的一个冒泡排序法的函数简单实例
May 26 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
Nov 05 PHP
微信公众号OAuth2.0网页授权问题浅析
Jan 21 PHP
php微信分享到朋友圈、QQ、朋友、微博
Feb 18 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 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
很温暖很温暖的Lester Young
2021/03/03 冲泡冲煮
Yii基于CActiveForm的Ajax数据验证用法示例
2016/07/14 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
2016/07/20 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
2017/03/02 PHP
Yaf框架封装的MySQL数据库操作示例
2019/03/06 PHP
javascript html 静态页面传参数
2009/04/10 Javascript
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
js打开windows上的可执行文件示例
2014/05/27 Javascript
javascript动态创建及删除元素的方法
2014/12/22 Javascript
jQuery实现自动调整字体大小的方法
2015/06/15 Javascript
用js读写cookie的简单方法(推荐)
2016/08/08 Javascript
前端框架Vue.js构建大型应用浅析
2016/09/12 Javascript
springmvc接收jquery提交的数组数据代码分享
2017/10/28 jQuery
Vue的土著指令和自定义指令实例详解
2018/02/04 Javascript
微信小程序自定义select下拉选项框组件的实现代码
2018/08/28 Javascript
Vue.js数字输入框组件使用方法详解
2019/10/19 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
vue3.0封装轮播图组件的步骤
2021/03/04 Vue.js
用Python中的wxPython实现最基本的浏览器功能
2015/04/14 Python
Python实现针对给定字符串寻找最长非重复子串的方法
2018/04/21 Python
python selenium 弹出框处理的实现
2019/02/26 Python
Django中使用 Closure Table 储存无限分级数据
2019/06/06 Python
浅谈Python中(&amp;,|)和(and,or)之间的区别
2019/08/07 Python
Python线程协作threading.Condition实现过程解析
2020/03/12 Python
TensorFlow固化模型的实现操作
2020/05/26 Python
交通安全教育制度
2014/02/02 职场文书
幼儿评语大全
2014/04/30 职场文书
党支部2014年度工作总结
2014/12/04 职场文书
中层干部考核评语
2015/01/04 职场文书
2015年银行柜员工作总结报告
2015/04/01 职场文书
小学生节水倡议书
2015/04/29 职场文书
结婚典礼主持词
2015/06/29 职场文书
初中班长竞选稿
2015/11/20 职场文书
2019升学宴主持词范本5篇
2019/10/09 职场文书