我们的接口是用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
和php报错一致,和java一起看了下java的日志,发现postman的请求直接被springboot给拒绝了,没有执行
然后选择了x-www-form-urlencoded,正常,
看到这里是不是恍然大悟
$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那边对请求做了限制,应该有个配置吧
查了下手册
举个例子
<?php $data = array('foo'=>'bar', 'baz'=>'boom', 'cow'=>'milk', 'php'=>'hypertext processor'); echo http_build_query($data) . "\n"; echo http_build_query($data, '', '&'); ?>
输出
foo=bar&baz=boom&cow=milk&php=hypertext+processor foo=bar&baz=boom&cow=milk&php=hypertext+processor
一个小地方折腾半天,还是自己太菜啊