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 相关文章推荐
第1次亲密接触PHP5(2)
Oct 09 PHP
提高define性能的php扩展hidef的安装和使用
Jun 14 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
Jul 03 PHP
需要注意的几个PHP漏洞小结
Feb 05 PHP
163的邮件用phpmailer发送(实例详解)
Jun 24 PHP
php中将一段数据存到一个txt文件中并显示其内容
Aug 15 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
Aug 22 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
Jul 02 PHP
Yii2中DropDownList简单用法示例
Jul 18 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
Apr 02 PHP
PHP+redis实现微博的拉模型案例详解
Jul 10 PHP
php优化查询foreach代码实例讲解
Mar 24 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
用ODBC的分页显示
2006/10/09 PHP
PHP完整的日历类(CLASS)
2006/11/27 PHP
php 魔术方法详解
2014/11/11 PHP
php使用cookie保存登录用户名的方法
2015/01/26 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
2016/11/25 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
Laravel find in set排序实例
2019/10/09 PHP
ExtJS Ext.MessageBox.alert()弹出对话框详解
2010/04/02 Javascript
基于JQuery的日期联动实现代码
2011/02/24 Javascript
获取body标签的两种方法
2011/10/13 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
JavaScript验证电子邮箱的函数
2014/08/22 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
体验jQuery和AngularJS的不同点及AngularJS的迷人之处
2016/02/02 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
nodejs微信公众号支付开发
2016/09/19 NodeJs
浅谈js对象的创建和对6种继承模式的理解和遐想
2016/10/16 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
js实现textarea限制输入字数
2017/02/13 Javascript
深入理解Nodejs Global 模块
2017/06/03 NodeJs
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
[01:04:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第二场 1月31日
2021/03/11 DOTA
Python中用于计算对数的log()方法
2015/05/15 Python
Python语言描述最大连续子序列和
2017/12/05 Python
Django发送邮件功能实例详解
2019/09/02 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
Pytorch根据layers的name冻结训练方式
2020/01/06 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
python利用proxybroker构建爬虫免费IP代理池的实现
2021/02/21 Python
Mytheresa英国官网:拥有160多个奢侈品品牌
2016/10/09 全球购物
大学生村官工作感言
2014/01/10 职场文书
大学生志愿者感言
2014/01/15 职场文书
MySQL七种JOIN类型小结
2021/10/24 MySQL
Netflix《海贼王》真人版剧集多张片场照曝光
2022/04/04 日漫
Android开发手册Chip监听及ChipGroup监听
2022/06/10 Java/Android