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

薄洪涛6年前PHP1257

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

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

相关文章

Yii2.0框架ActiveForm总结

首先引入ActiveForm和Html这里两个是很重要的<?php     use yii\bootstrap\ActiveForm; &nbs...

YII2独立开发遇到的坑

    之前开发的时候,遇到图片上传什么的都是直接用前辈们配好的插件等等,换了家公司以后,要自己独立开发项目,顿时遇到了问题,开始是项目的配置,然后在添加的时候遇到了图片上传的问题...

谷歌浏览器加载前端资源status=canceled

谷歌浏览器加载前端资源status=canceled

如图,今天在做弹出框(modal中用了iframe)的时候,发现模态框弹出的时候,会有一些前端资源加载被取消,但是也会有加载时间,影响页面的加载速度;然后我尝试用火狐,发现没有这个问题经过一顿goog...

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

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

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

抢红包的一些实现思路

抢红包的一些实现思路

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

大文件之分片上传

大文件之分片上传

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

发表评论    

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