php发送post请求的三种方法


Posted in PHP onFebruary 11, 2014

方法一:

/**
 * 发送post请求
 * @param string $url 请求地址
 * @param array $post_data post键值对数据
 * @return string
 */
function send_post($url, $post_data) {

  $postdata = http_build_query($post_data);
  $options = array(
    'http' => array(
      'method' => 'POST',
      'header' => 'Content-type:application/x-www-form-urlencoded',
      'content' => $postdata,
      'timeout' => 15 * 60 // 超时时间(单位:s)
    )
  );
  $context = stream_context_create($options);
  $result = file_get_contents($url, false, $context);

  return $result;
}

//使用方法
$post_data = array(
  'username' => 'stclair2201',
  'password' => 'handan'
);
send_post('https://3water.com', $post_data);

方法二:Socket版本

<?php
/**
 * Socket版本
 * 使用方法:
 * $post_string = "app=socket&version=beta";
 * request_by_socket('chajia8.com', '/restServer.php', $post_string);
 */
function request_by_socket($remote_server,$remote_path,$post_string,$port = 80,$timeout = 30) {
  $socket = fsockopen($remote_server, $port, $errno, $errstr, $timeout);
  if (!$socket) die("$errstr($errno)");
  fwrite($socket, "POST $remote_path HTTP/1.0");
  fwrite($socket, "User-Agent: Socket Example");
  fwrite($socket, "HOST: $remote_server");
  fwrite($socket, "Content-type: application/x-www-form-urlencoded");
  fwrite($socket, "Content-length: " . (strlen($post_string) + 8) . "");
  fwrite($socket, "Accept:*/*");
  fwrite($socket, "");
  fwrite($socket, "mypost=$post_string");
  fwrite($socket, "");
  $header = "";
  while ($str = trim(fgets($socket, 4096))) {
    $header .= $str;
  }

  $data = "";
  while (!feof($socket)) {
    $data .= fgets($socket, 4096);
  }

  return $data;
}
?>

方法三:Curl版本

<?php
/**
 * Curl版本
 * 使用方法:
 * $post_string = "app=request&version=beta";
 * request_by_curl('https://3water.com/restServer.php', $post_string);
 */
function request_by_curl($remote_server, $post_string) {
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $remote_server);
  curl_setopt($ch, CURLOPT_POSTFIELDS, 'mypost=' . $post_string);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_USERAGENT, "3water.com's CURL Example beta");
  $data = curl_exec($ch);
  curl_close($ch);

  return $data;
}
?>

下面是其他网友的方法:

class Request{
  public static function post($url, $post_data = '', $timeout = 5){//curl
    $ch = curl_init();
    curl_setopt ($ch, CURLOPT_URL, $url);
    curl_setopt ($ch, CURLOPT_POST, 1);
    if($post_data != ''){
      curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    }
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_HEADER, false);
    $file_contents = curl_exec($ch);
    curl_close($ch);
    return $file_contents;
  }
  public static function post2($url, $data){//file_get_content
    
    $postdata = http_build_query(
      $data
    );
    
    $opts = array('http' =>
           array(
             'method' => 'POST',
             'header' => 'Content-type: application/x-www-form-urlencoded',
             'content' => $postdata
           )
    );
    
    $context = stream_context_create($opts);
    $result = file_get_contents($url, false, $context);
    return $result;
  }
  public static function post3($host,$path,$query,$others=''){//fsocket
    $post="POST $path HTTP/1.1\r\nHost: $host\r\n";
    $post.="Content-type: application/x-www-form-";
    $post.="urlencoded\r\n${others}";
    $post.="User-Agent: Mozilla 4.0\r\nContent-length: ";
    $post.=strlen($query)."\r\nConnection: close\r\n\r\n$query";
    $h=fsockopen($host,80);
    fwrite($h,$post);
    for($a=0,$r='';!$a;){
        $b=fread($h,8192);
        $r.=$b;
        $a=(($b=='')?1:0);
      }
    fclose($h);
    return $r;
  }
}

大家可以根据需要选择适合自己的即可。

PHP 相关文章推荐
PHP静态类
Nov 25 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
Jul 01 PHP
对于PHP 5.4 你必须要知道的
Aug 07 PHP
phpmyadmin config.inc.php配置示例
Aug 27 PHP
php过滤html标记属性类用法实例
Sep 23 PHP
Laravel模板引擎Blade中section的一些标签的区别介绍
Feb 10 PHP
PHP图像处理类库MagickWand用法实例分析
May 21 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
Oct 16 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
Jul 19 PHP
ThinkPHP框架表单验证操作方法
Jul 19 PHP
基于swoole实现多人聊天室
Jun 14 PHP
PHP中数组转换为SimpleXML教程
Jan 27 PHP
codeigniter教程之多文件上传使用示例
Feb 11 #PHP
php创建sprite
Feb 11 #PHP
PHP循环结构实例讲解
Feb 10 #PHP
更改localhost为其他名字的方法
Feb 10 #PHP
php 获取SWF动画截图示例代码
Feb 10 #PHP
php导入csv文件碰到乱码问题的解决方法
Feb 10 #PHP
php判断正常访问和外部访问的示例
Feb 10 #PHP
You might like
PHP语法速查表
2006/12/06 PHP
分页详解 从此分页无忧(PHP+mysql)
2007/11/23 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
php异常处理捕获错误整理
2019/09/23 PHP
在laravel框架中实现封装公共方法全局调用
2019/10/14 PHP
通过length属性判断jquery对象是否存在
2013/10/18 Javascript
jQuery实现单击按钮遮罩弹出对话框(仿天猫的删除对话框)
2014/04/10 Javascript
点评js异步加载的4种方式
2015/12/22 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
使用jsonp实现跨域获取数据实例讲解
2016/12/25 Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
2017/05/08 Javascript
BootStrap 动态表单效果
2017/06/02 Javascript
Angular设置别名alias的方法
2018/11/08 Javascript
vue中动态select的使用方法示例
2019/10/28 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
2020/08/18 Javascript
Nuxt的路由动画效果案例
2020/11/06 Javascript
python下载文件时显示下载进度的方法
2015/04/02 Python
python获取当前计算机cpu数量的方法
2015/04/18 Python
简单介绍Python中用于求最小值的min()方法
2015/05/15 Python
基于python 字符编码的理解
2017/09/02 Python
Python基于TCP实现会聊天的小机器人功能示例
2018/04/09 Python
详解Python打包分发工具setuptools
2019/08/05 Python
Python 利用高德地图api实现经纬度与地址的批量转换
2019/08/14 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
2020/04/29 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
2021/03/03 Python
Regatta官网:英国最受欢迎的户外服装和鞋类品牌
2019/05/01 全球购物
艺术系应届生的自我评价
2013/10/19 职场文书
网页美工求职信范文
2014/04/17 职场文书
《莫泊桑拜师》教学反思
2014/04/23 职场文书
机械专业应届毕业生自荐书
2014/06/12 职场文书
优秀党员申报材料
2014/12/18 职场文书
活着观后感
2015/06/03 职场文书
如何用JS实现网页瀑布流布局
2021/04/24 Javascript
索尼ICF-5900W收音机测评
2022/04/24 无线电
Tomcat弱口令复现及利用
2022/05/06 Servers
virtualenv隔离Python环境的问题解析
2022/06/21 Python