php用curl模拟post请求接口的坑

薄洪涛6年前PHP1432

我们的接口是用java实现的,然后我需要用php去调用下接口,请求方式为post,需要传一个数组过去(不是json_encode的那种),之前的时候,是这么写的

$post_params = [
    'xxx'=>$xxx,
    'beginDate'=>$beginDate,
    'endDate'=>$endDate
];
Yii::info($post_params,'info');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1); //post数据提交
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_params); //数据
$body = curl_exec($ch);
curl_close($ch);
$rs = json_decode($body, true);

但是今早出现了报错新息

"Could not parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.7851719030896486492.51002/work/Tomcat/localhost/ROOT] is not valid"

下意识的认为应该是java的锅,但java表示接口最近没有改动,同样,我这边也没有改动,这就奇怪了啊

于是用curl请求了下接口

curl -d "xxx=xxx&beginDate=2019-05-19&endDate=2019-08-19" http://xxxxx/xxx/xx/xx/xx/

有返回数据啊,一切正常,我不死心,用postman请求

开始的时候,数据选择的是form-data

TIM截图20190819140951.png

和php报错一致,和java一起看了下java的日志,发现postman的请求直接被springboot给拒绝了,没有执行

然后选择了x-www-form-urlencoded,正常,

TIM截图20190819141016.png

看到这里是不是恍然大悟

$post_params = [
    'xxx'=>$xxx,
    'beginDate'=>$beginDate,
    'endDate'=>$endDate
];
Yii::info($post_params,'info');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); //地址
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1); //post数据提交
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_params)); //数据
$body = curl_exec($ch);
curl_close($ch);
$rs = json_decode($body, true);

加了http_build_query之后,对要请求的参数进行处理,立马就正常了,看起来应该是java那边对请求做了限制,应该有个配置吧

查了下手册


image.png

举个例子

<?php
$data = array('foo'=>'bar',
              'baz'=>'boom',
              'cow'=>'milk',
              'php'=>'hypertext processor');

echo http_build_query($data) . "\n";
echo http_build_query($data, '', '&amp;');

?>

输出

foo=bar&baz=boom&cow=milk&php=hypertext+processor
foo=bar&amp;baz=boom&amp;cow=milk&amp;php=hypertext+processor

一个小地方折腾半天,还是自己太菜啊

相关文章

【转】TCP长连接和短连接区别

【转】TCP长连接和短连接区别

    当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放...

Elasticsearch集群第一篇之安装

Elasticsearch集群第一篇之安装

    全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选。它可以快速地储存...

Elasticsearch第二篇之数据操作

    上一篇向大家讲解了Elasticsearch的部署安装和基本设置,这篇文章就和大家一起熟悉下Elastic的数据库操作,和普通数据库不同,es库需要公告...

redis持久化的两种方式

redis持久化的两种方式

redis为了内存数据的安全考虑,会把内存中的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边。数据保存到硬盘的过程就称为“持久化”效果。redis支持...

Elasticsearch为什么搜索那么快?

Elasticsearch为什么搜索那么快?

介绍Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lu...

Yii2.0搭建接口模块教程

Yii2.0搭建接口模块教程

最近我需要做一个大项目中的一个模块,考虑用前后端分离,所以想自己搭建一套基于Yii2.0的restful接口出来,本来的时候老大想让我用spring boot,无奈我太菜只会php.....教程开始:...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。