PHP发送POST请求
方式一: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请求的更多相关文章
- Java发送Http请求并获取状态码
通过Java发送url请求,查看该url是否有效,这时我们可以通过获取状态码来判断. try { URL u = new URL("http://10.1.2.8:8080/fqz/page ...
- AngularJs的$http发送POST请求,php无法接收Post的数据解决方案
最近在使用AngularJs+Php开发中遇到php后台无法接收到来自AngularJs的数据,在网上也有许多解决方法,却都点到即止.多番摸索后记录下解决方法:tips:当前使用的AngularJ ...
- Ajax发送POST请求SpringMVC页面跳转失败
问题描述:因为使用的是SpringMVC框架,所以想使用ModelAndView进行页面跳转.思路是发送POST请求,然后controller层中直接返回相应ModelAndView,但是这种方法不可 ...
- 使用HttpClient来异步发送POST请求并解析GZIP回应
.NET 4.5(C#): 使用HttpClient来异步发送POST请求并解析GZIP回应 在新的C# 5.0和.NET 4.5环境下,微软为C#加入了async/await,同时还加入新的Syst ...
- 在发送ajax请求时加时间戳或者随机数去除js缓存
在发送ajax请求的时候,为了保证每次的都与服务器交互,就要传递一个参数每次都不一样,这里就用了时间戳 大家在系统开发中都可能会在js中用到ajax或者dwr,因为IE的缓存,使得我们在填入相同的值的 ...
- HttpUrlConnection发送url请求(后台springmvc)
1.HttpURLConnection发送url请求 public class JavaRequest { private static final String BASE_URL = "h ...
- kattle 发送post请求
一.简介 kattle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,数据抽取高效稳定.它允许你管理来自不同数据库的数据,通过提供一个图形化的用户环境来描述 ...
- 【荐】怎么用PHP发送HTTP请求(POST请求、GET请求)?
file_get_contents版本: <?php /** * 发送post请求 * @param string $url 请求地址 * @param array $post_data pos ...
- 使用RestTemplate发送post请求
最近使用RestTemplate发送post请求,遇到了很多问题,如转换httpMessage失败,中文乱码等,调了好久才找到下面较为简便的方法: RestTemplate restTemplate ...
- 【转载】JMeter学习(三十六)发送HTTPS请求
Jmeter一般来说是压力测试的利器,最近想尝试jmeter和BeanShell进行接口测试.由于在云阅读接口测试的过程中需要进行登录操作,而登录请求是HTTPS协议.这就需要对jmeter进行设置. ...
随机推荐
- js-input框中写入的小写小写字母全部转换成大写字母的js代码
<input type="text" id="blinitials" name="blinitials" onkeyup=" ...
- Learning-Python【31】:操作系统基础知识
什么是操作系统 计算机系统由硬件和软件两部分组成.操作系统(OS,Operating System)是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩充.它在计算机系统中占据了特别重要的地位:而其 ...
- 【五】jquery之事件(focus事件与blur事件)[提示语的出现及消失时机]
例题:当鼠标移动到某个文本框时,提示语消失. 当失去焦点时,如果该文本框有内容,保存内容.没有内容,则恢复最初的提示语句 <!DOCTYPE html> <html> < ...
- Hibernate向数据库存入BLOB和CLOB类型的数据
我选用的是byte[] +@Lob 刚开始采用的java.sql.Blob,将上传的图片getBytes()后,通过Hibernate.getLobCreator(HibernateSessionFa ...
- 《HTTP 权威指南》笔记:第十五章 实体与编码
 如果把 「HTTP 报文」想象为因特网货运系统的「箱子」,那么「HTTP 实体」就是报文中的实际的「货物」. 其中,实体又包含了「实体首部」 和 「实体主体」,实体首部用于描述各种参数,实体主体就 ...
- form表单的提交方式
开发中表单提交是很常见的,表单的提交方式也多种方式. 1.使用submit按钮提交表单 <input type="submit"/> <!DOCTYPE htm ...
- regex-ways
regex的分组与捕获:分组就是用小括号(str)括起来的东西,就是一个分组.要想得到这些分组的信息,就要想办法捕获.每个分组都有编号,编号规则是从外向内,从左至右. .例如,在表达式 (A)(B(C ...
- CI集成 mesos 资源分配的思考, 待续
读了mesos的论文(https://people.eecs.berkeley.edu/~alig/papers/mesos.pdf ),感觉应用在 CI 上的资源管理很赞,能够解决 jenkins在 ...
- js 获取getElementsTagName()方法返回值的内容
<div id="news-top" class="section"> <h3>Some title</h3> <di ...
- 在git服务器上创建项目过程及遇到的问题
一: 登录git服务器,输入用户名,密码等 二: New Project 添加项目 设置组可见,项目名称等. 创建成功的项目可以看到该项目的clone地址,可以通过http,ssh两种方式来获取: 三 ...