方式一: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. 若快打码平台python开发文档修改版

    一.打码的作用 在进行爬虫过程中,部分网站的登录验证码是比较简单的,例如四个英文数字随机组合而成的验证码,有的是全数字随机组成的验证码,有的是全中文随机组成的验证码.为了爬虫进行自动化,需要解决自动登 ...

  2. Lintcode481-Binary Tree Leaf Sum-Easy

    481. Binary Tree Leaf Sum Given a binary tree, calculate the sum of leaves. Example Example 1: Input ...

  3. Bioconductor软件安装与升级

    1 安装工具Bioc的软件包不能使用直接install.packages函数,它有自己的安装工具,使用下面的代码: source("https://bioconductor.org/bioc ...

  4. 浅谈Cocos2d-js cc.director

    在cocos2d-x里面,游戏的任何时间,只有一个场景对象实例处于运行状态,该对象可以作为当前游戏内容的整体包对象. 环境设定 进入游戏之前,导演会设置游戏的运行环境: 设置游戏视图,包含视图的投射, ...

  5. ios外派公司—提供ios程序员外派ios应用外包业务(北京动点 可签合同)

    北京动点飞扬长年提供ios工程师外派业务. 我公司程序员平均技术情况如下: 1.二年以上iPhone/ipad开发经验: 2.熟练使用Xcode.Objective C编码技能: 3.熟悉iOS开发框 ...

  6. 四:DRF项目开发的准备

    一: 虚拟环境virtualenv 如果在一台电脑上, 想开发多个不同的项目, 需要用到同一个包的不同版本, 如果使用上面的命令, 在同一个目录下安装或者更新, 新版本会覆盖以前的版本, 其它的项目就 ...

  7. .net中文分词 jieba.NET

    简介 平时经常用Python写些小程序.在做文本分析相关的事情时免不了进行中文分词,于是就遇到了用Python实现的结巴中文分词.jieba使用起来非常简单,同时分词的结果也令人印象深刻,有兴趣的可以 ...

  8. B站(Bilibili) 视频的下载。

    1) 第一种是众所周知的方法,在URL的 bilibili 前加个 i, 就可以有视频的mp4的地址,然后用下载器下载. 比如 想 下载 https://www.bilibili.com/video/ ...

  9. NFine中权限判断出错的问题

    NFine中权限判断出错的问题 问题描述:登录后点击栏目一,弹出了窗口一,再点击栏目二,弹出了窗口二,然后再点击窗口一,再执行窗口一中的操作时,发现已没有任何权限,调试后发现在HandlerAutho ...

  10. selenium java 文件上传、下载

    1.webdriver对页面文件的下载 我们一般操作浏览器下载时会让我们选择下载的目录然后经过一系列操作后才进行文件下载操作,但是用webdriver不能按这样的方式操作.经过查询资料找到了如下的实现 ...