方式一: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. Cmd Markdown 编辑阅读器

    我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 -- 我们为记录思想和分享知识提供更专业的工具. 您可以使用 Cmd ...

  2. Learning-Python【11】:函数嵌套及作用域

    一.函数对象 函数是第一类对象:函数的内存地址(即函数名)可以像一个变量值一样去使用 1.变量值可以被引用,例如 x = 1,y = x def foo(): print('from foo') f ...

  3. vmware中虚拟化的问题

    因为用的是Window系统,又不想换系统,所以在学习Linux时,使用的VMware来安装的Centos,想在VMware中安装KVM虚拟机,然后报错,说我没有打开虚拟化,我使用 的是Surface ...

  4. vue--音乐播放器

    github: https://github.com/vinieo/vue-music 效果: 基础组件: 1.confirm:确认对话框组件 2.listview:通讯录列表组件 3.loading ...

  5. 学习笔记69—金蝶财务软件安装教程(KIS12.3,win10)

    ****************************************************** 如有谬误,请联系指正.转载请注明出处. 联系方式: e-mail: heyi9069@gm ...

  6. pycharm 倒入request包方法(新手)

    1.先安装request模块,在pycharm import,但是怎么也倒不进去,咨询了开发,原来需要把包倒入到pycharm 编译器里面才可以import 成功,具体操作步骤如下 首先确认下自己电脑 ...

  7. javascript五种基本类型

    typeof 功能:检测变量的类型 语法:console.log(typeof  变量) 或  console.log(typeof (变量)): 五大基本类型 1.underfined 声明变量但是 ...

  8. PAT 1077 Kuchiguse

    1077 Kuchiguse (20 分)   The Japanese language is notorious for its sentence ending particles. Person ...

  9. c++中的c_str()用法

    语法: const char *c_str(); c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 这是为了与c语言兼容,在c语言中没有string类型,故必须通过st ...

  10. 解决pycharm添加第三方包失败

    今天想用pycharm打开图像,但是import scipy的时候报错了,报错内容如下: from scipy.misc import imread Traceback (most recent ca ...