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

薄洪涛5年前PHP1172

我们的接口是用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执行效率

    在项目开发过程中,经常遇到了一些PHP处理程序性能底下的情况,程序运行在centos+nginx环境,虽然这个有很多的原因如:服务器本身配置,运行环境n...

php redis Hash操作

//为user表中的字段赋值。成功返回1,失败返回0。若user表不存在会先创建表再赋值,若字段已存在会覆盖旧值。 $redis->hSet('user', ...

大文件之分片上传

大文件之分片上传

    我们知道,无论是nginx还是php,都会对上传文件的大小做限制,今天刚刚做了一个客户端包的管理,要求上传apk或者ipa文件,而且都不小(超出了php...

redis持久化的两种方式

redis持久化的两种方式

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

PHP程序猿食用RabbitMQ方法

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

Yii2.0整合ueditor并上传图片到七牛云

Yii2.0整合ueditor并上传图片到七牛云

某个项目要做一个文章模块,用到Ueditor,并且ue中的图片要上传到七牛,所以总结下步骤;1、Yii2.0下载ueditor for Yii2.0和七牛composer require&n...

发表评论    

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