首页 技术PHP正文

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

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

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

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

评论

精彩评论
  • 2019-08-19 14:31:03

    x-www-form-urlencoded和form-data区别可以百度搜索,我就不再总结了类似文章太多了