方式一: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. Java正则中为什么反斜线"\"需要用“\\\\”表示,原因详解。

    首先,我们需要知道在java字符串和正则表达式中,“\”都具有特殊的含义. 一.在Java的字符串中"\"有两个功能 (一)代表特殊字符:\t代表制表符,\n代表换行....等. ...

  2. (转)Awesome Human Pose Estimation

    Awesome Human Pose Estimation 2018-10-08 11:02:35 Copied from: https://github.com/cbsudux/awesome-hu ...

  3. Go 使用 JSON

    Encode 将一个对象编码成 JSON 数据,接受一个 interface{} 对象,返回 []byte 和 err func Marshal(v interface{}) {[]byte,err} ...

  4. H5高德地图获取当前位置

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...

  5. Linux下Java环境安装

    本节主要讲解Linux(Centos 6.5)下Java环境的安装 1. 卸载机器上默认安装的JDK 在Linux环境下一般会默认安装jdk,为了自己项目的开发部署,一般情况要重新装jdk,而且自己装 ...

  6. 在idea中用tomcat远程部署调试

    适用于生产环境下的调试. 1.catalina配置 在服务器的bin下创建setenv.sh,内容如下 1099是jmx,最后是服务器ip 2.启动tomcat ./catalina.sh jpda ...

  7. this理解

    <script type="text/javascript"> //"this关键字引用的是 包含它的那个函数 作为某个对象的方法 被调用时所属的那个对象&q ...

  8. CentOS卸载通过yum安装的软件

    以erlang为例:rpa -qa|grep erlang 使用:yum -y remove erlang-* 扩展--查看yum安装软件的路径:rpm -ql erlang-cosFileTrans ...

  9. 使用mint-ui中弹框组件与原生弹框阻止父页面不滑动方法

    1,使用mint-ui框架中<mt-popup></mt-popup>,在组件中加入 lockScroll="true" 阻止父页面不滑动. 2,原生弹框中 ...

  10. Python3解析dex文件

    一.说明 1.1 背景说明 看<加密与解密>的时候反复听说“PE文件格式”,到Android安全兴起就不断听说“dex文件格式”.意思是看得懂的,但自己不能手解析一番总觉得不踏实,所以决定 ...