方式一:cURL

$url = "localhost/test/post/service.php";
$data = array("a"=>"网");
//初始化curl资源
$curl = curl_init(); //设置请求地址
curl_setopt($curl, CURLOPT_URL, $url); //设置获得返回的数据,如果设置为0那么执行结果如果成功的话只会输出true,不会得到对方返回的数据
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //设置请求方式 非零数表示设置该请求为一个普通的post请求
curl_setopt($curl, CURLOPT_POST, 1 ); //设置请求超时时间
curl_setopt($curl, CURLOPT_TIMEOUT,5*60); //设置请求头信息 请求头是以数组形式设置
$header = array();
$header []= 'Content-Type: application/x-www-form-urlencoded; charset=utf-8';//指定请求数据类型和字符编码
$header []= 'Authorization: Basic '.base64_encode("username:password");//如果使用http基本验证(username表示账号,password表示密码,中间用一个冒号:隔开)
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
//设定为不验证证书和host
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
//当遇到location跳转时,直接抓取跳转的页面,,有时会返回301,因为服务器使用了重定向
curl_setopt($curl,CURLOPT_FOLLOWLOCATION,1);
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 1); //设置发送数据
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
/**
用php模仿出form表单发出的请求
由于form表单的数据格式都是字符串 key=value&key2=value2..的形式,所以需要使用 $data = http_build_query($data)将数组数据转换一下。
**/ //执行请求并获得返回的数据
$tmpInfo = curl_exec ($curl);
$error = curl_error($curl);//如果该数据不是空字符串,表示请求异常,且返回异常信息 //如果提交的数据是以http_build_query转换后的字符串,有可能POST的数据部分会超过1024字节,
//发送POST请求时header部分会包含一个参数Expect:100-continue,询问服务器是否愿意接收数据,收到服务器返回的100-continue应答后再把数据POST给服务器。
//这时就会造成返回的数据中会夹杂着头文件信息且以字符串的形式跟数据拼接在一起。就需要将头信息与数据体分离
$sentHeaders = curl_getinfo($curl, CURLINFO_HEADER_OUT);
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE); //关闭会话
curl_close ($curl);
$header = substr($tmpInfo, 0, $headerSize);
$body = substr($tmpInfo, $headerSize);
var_dump(json_decode($tmpInfo,true));

模仿表单请求 示例:

    function curl_form($post_data,$sumbit_url)
{
$post_data = http_build_query($post_data);//模拟浏览器post请求需要将数据转换一下,因为浏览器请求时 数据集不是键值对,而是 &key=value 这样的一串
//初始化
$curl = curl_init();
//设置抓取的url
curl_setopt($curl, CURLOPT_URL, $sumbit_url);
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 1);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//设置post方式提交
curl_setopt($curl, CURLOPT_POST, 1); //设置post数据
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
//执行命令
$tmpInfo = curl_exec ($curl);
$error = curl_error($curl);
//当PHP cURL 时,如果POST的数据部分超过了1024字节,发送POST请求时header部分会包含一个参数Expect:100-continue,询问服务器是否愿意接收数据,收到服务器返回的100-continue应答后再把数据POST给服务器。
$sentHeaders = curl_getinfo($curl, CURLINFO_HEADER_OUT);
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE); curl_close ($curl); $header = substr($tmpInfo, 0, $headerSize);
$body = substr($tmpInfo, $headerSize); if($error != '')return "error:".$error;
//关闭会话
return $body;
}

方法二:file_get_contents()

$post_data = array("name" => "王小刚","age" => 25);
//将数组进行urlencode编码变成key=value&key=value字符串
$postdata = http_build_query($post_data);
//请求参数准备
$option = array(
'http' => array(
'method' => 'POST',
'header' => array('Content-type:application/x-www-form-urlencoded',"Accept-language: en"),
'content' => $postdata,
'timeout' => 5*60
),
  "ssl" => array(//不用验证https证书
            "verify_peer" => false,
            "verify_peer_name" => false
        )
);
//创建一个资源流上下文
$context = stream_context_create($option);
$result = file_get_contents("http://localhost/potatog/post/service.php", false, $context);
var_dump(json_decode($result,true));

大多数情况下 比如与别人做对接  对方都会要求是utf-8的数据格式 所以以上的请求数据需要经过转换

//默认UTF-8编码格式
        $o="";
        foreach ($data as $k=>$v)
        {
            $o.= "$k=".urlencode($v)."&";
        }
        $data=substr($o,0,-1);

这段代码的效果雷同$data =  http_build_query($data)

PHP发送POST请求的更多相关文章

  1. Java发送Http请求并获取状态码

    通过Java发送url请求,查看该url是否有效,这时我们可以通过获取状态码来判断. try { URL u = new URL("http://10.1.2.8:8080/fqz/page ...

  2. AngularJs的$http发送POST请求,php无法接收Post的数据解决方案

      最近在使用AngularJs+Php开发中遇到php后台无法接收到来自AngularJs的数据,在网上也有许多解决方法,却都点到即止.多番摸索后记录下解决方法:tips:当前使用的AngularJ ...

  3. Ajax发送POST请求SpringMVC页面跳转失败

    问题描述:因为使用的是SpringMVC框架,所以想使用ModelAndView进行页面跳转.思路是发送POST请求,然后controller层中直接返回相应ModelAndView,但是这种方法不可 ...

  4. 使用HttpClient来异步发送POST请求并解析GZIP回应

    .NET 4.5(C#): 使用HttpClient来异步发送POST请求并解析GZIP回应 在新的C# 5.0和.NET 4.5环境下,微软为C#加入了async/await,同时还加入新的Syst ...

  5. 在发送ajax请求时加时间戳或者随机数去除js缓存

    在发送ajax请求的时候,为了保证每次的都与服务器交互,就要传递一个参数每次都不一样,这里就用了时间戳 大家在系统开发中都可能会在js中用到ajax或者dwr,因为IE的缓存,使得我们在填入相同的值的 ...

  6. HttpUrlConnection发送url请求(后台springmvc)

    1.HttpURLConnection发送url请求 public class JavaRequest { private static final String BASE_URL = "h ...

  7. kattle 发送post请求

    一.简介 kattle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,数据抽取高效稳定.它允许你管理来自不同数据库的数据,通过提供一个图形化的用户环境来描述 ...

  8. 【荐】怎么用PHP发送HTTP请求(POST请求、GET请求)?

    file_get_contents版本: <?php /** * 发送post请求 * @param string $url 请求地址 * @param array $post_data pos ...

  9. 使用RestTemplate发送post请求

    最近使用RestTemplate发送post请求,遇到了很多问题,如转换httpMessage失败,中文乱码等,调了好久才找到下面较为简便的方法: RestTemplate restTemplate ...

  10. 【转载】JMeter学习(三十六)发送HTTPS请求

    Jmeter一般来说是压力测试的利器,最近想尝试jmeter和BeanShell进行接口测试.由于在云阅读接口测试的过程中需要进行登录操作,而登录请求是HTTPS协议.这就需要对jmeter进行设置. ...

随机推荐

  1. Hi3519v101 SDK安装及升级

    安装SDK 1.解压tgz压缩包 将 Hi3519V101_SDK_Vx.x.x.x.tgz 压缩包放入共享文件夹中,并解压到Linux内部如 /sdk 目录下,因为在共享目录中编译容易出现各种错误. ...

  2. 微信小程序(一)快递查询

    2007 年 1 月 9 日,乔布斯在旧金山莫斯科尼会展中心发布了首款 iPhone,而在十年后的 1 月 9 日,微信小程序正式上线.张小龙以这样的形式,向乔布斯致敬. 小程序在哪里? 小程序功能模 ...

  3. LINQ之路14:LINQ Operators之排序和分组(Ordering and Grouping)

    本篇继续LINQ Operators的介绍,这里要讨论的是LINQ中的排序和分组功能.LINQ的排序操作符有:OrderBy, OrderByDescending, ThenBy, 和ThenByDe ...

  4. 【转载】Xpath定位方法深入探讨及元素定位失败常见情况

    一.Xpath定位方法深入探讨 (1)常用的Xpath定位方法及其特点 使用绝对路径定位元素. 例如: driver.findElement(By.xpath("/html/body/div ...

  5. [python]windows截图

    Windows截图 截图:截取屏幕任意大小图片 下载pip install Pillow from PIL import ImageGrab # x1:开始截图的x坐标 # x2:开始截图的y坐标; ...

  6. 【洛谷p1605】迷宫

    (还记得我昨天大概没人看到的博客(我删辽)吗qwq,2019.4.14下午交的qwq 那篇博客大致内容就是:我提交楼上这道题,交了好久好久好久好久 现在我告诉你,那次评测还N/A着呢qwq) tqlq ...

  7. 『Python CoolBook』C扩展库_其三_简单数组操作

    点击进入项目 这里的数组要点在于: 数组结构,array.array或者numpy.array 本篇的数组仅限一维,不过基础的C数组也是一维 一.分块讲解 源函数 /* Average values ...

  8. netty源码分析之一:server的启动

    nio server启动的第一步,都是要创建一个serverSocketChannel,我截取一段启动代码,一步步分析: public void afterPropertiesSet() throws ...

  9. PXE 实现自动装机

    搭建 PXE 远程安装服务器 image_1cqg00g0os9b1pop122e98o19ef9b.png-255kB 1.把光盘源放在/var/ftp/centos6 因为远程装机对放服务器得读取 ...

  10. SSH登录异常(someone is doing something nasty)

    在平时工作中,有时候需要SSH登陆到别的Linux主机上去,但有时候SSH登陆会被禁止,并弹出如下类似提示: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...