使用php模拟post传值虽然在日常生活中用到的不是很多,但是在某些场合还是经常用到的。下面服务器之家小编给大家整理了三种php模拟post传值的方法,file_get_contents、curl和socket。
第一种:file_get_contents来模拟post
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<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提交请求,调用接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/**
* 模拟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 ;
}
|
这是方法,
下面是具体的调用案例。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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是拼接出来的。
也可以改造成下面的方式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
/**
* 模拟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 ;
}
|
将拼接也封装了起来,这样调用的时候就更简洁了。
1
2
3
4
5
6
7
8
9
10
11
|
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 );
}
|