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

薄洪涛6年前PHP1539

我们的接口是用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

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

相关文章

PHP程序猿食用RabbitMQ方法

消息队列是什么?“消息队列”是在消息的传输过程中保存消息的容器。“消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。消息被发送到队列中。“消...

Yii2.0 文件队列的使用

最近做了一个文件上传+处理的功能,需求是这样的,上传并读取.doc文件,并解析里面的内容入库读取文件并入库是使用python处理的,每个文件大约需要处理5-6秒,上传是使用的Yii2,我这里的思路是把...

laravel chunk 更新数据的坑

在一些情况下,我们需要对大批量的数据进行操作,如果这个时候我们使用foreach的话,很可能会遇到操作超时的情况。在Laravel框架中我们可以很方便的使用chunk方法来解决。来看一个简单的例子:$...

Yii2.0搭建接口模块教程

Yii2.0搭建接口模块教程

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

七牛上传报文件已存在

之前做了一个大文件的分片上传,做好之后就没管了,让客户端一直自己用着,然后期间偶尔会有浏览器不兼容的现象我也懒得改,然后十一回来,客户端就给我说,有文件上传不上去,然后正好手头没活,就用改了下先看下思...

抢红包的一些实现思路

抢红包的一些实现思路

最近探索了关于抢红包的一些实现思路,在此记录下本篇文章主要探讨了金额随机算法关于分布式锁的一些探索我们开始,首先说下抢红包的业务流程,分为两步,发红包和抢红包,在抢红包的时候,并发是非常大的,我们这里...

发表评论    

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