Curl转PHP遇过滤问题:无法获取带筛选条件的Bling API JSON数据
问题:添加过滤条件后无法获取Bling API的JSON数据
我在把Curl转成PHP代码时遇到问题,需要获取JSON数据并做过滤。不加过滤能正常拿到全部数据,但加了过滤条件就无法访问数据了。
可正常获取全部数据的代码
<?php $apikey = 'myapikey'; $outputType = 'json'; $url = 'https://bling.com.br/Api/v2/contasreceber/' . $outputType; $retorno = executeGetOrder($url, $apikey); echo $retorno; function executeGetOrder($url, $apikey){ $curl_handle = curl_init(); curl_setopt($curl_handle, CURLOPT_URL, $url . '&apikey=' . $apikey); curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, TRUE); $response = curl_exec($curl_handle); curl_close($curl_handle); return $response; } ?>
添加过滤条件后无法运行的代码
根据Bling的API文档,我尝试添加过滤条件,但代码无法正常工作:
<?php $apikey = 'myapikey'; $outputType = 'json'; $url = 'https://bling.com.br/Api/v2/contasreceber/' . $outputType; $retorno = executeGetOrder($url, $apikey); echo $retorno; function executeGetOrder($url, $apikey){ $curl_handle = curl_init(); curl_setopt($curl_handle, CURLOPT_URL, $url . '&apikey=' . $apikey); curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'GET'); curl_setopt($curl_handle, CURLOPT_POSTFIELDS, 'filters=dataEmissao[01/01/2022 TO 05/02/2022]; situacao[Aberto]'); $headers = array(); $headers[] = 'Content-Type: application/x-www-form-urlencoded'; curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $headers); $response = curl_exec($curl_handle); curl_close($curl_handle); return $response; } ?>
问题原因与修复方案
问题核心在于GET请求不能通过POST请求体传递参数。Bling的这个接口是GET类型,过滤条件需要作为URL的查询参数传递,而非放在POSTFIELDS里。
修复后的代码如下:
<?php $apikey = 'myapikey'; $outputType = 'json'; // 对过滤条件做URL编码,避免特殊字符导致解析错误 $filters = urlencode('dataEmissao[01/01/2022 TO 05/02/2022]; situacao[Aberto]'); // 直接将所有参数拼接到URL中 $url = "https://bling.com.br/Api/v2/contasreceber/$outputType?apikey=$apikey&filters=$filters"; $retorno = executeGetOrder($url); echo $retorno; function executeGetOrder($url){ $curl_handle = curl_init(); curl_setopt($curl_handle, CURLOPT_URL, $url); curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, TRUE); // 捕获curl错误,方便排查问题 if(curl_errno($curl_handle)){ echo 'Curl错误:' . curl_error($curl_handle); } $response = curl_exec($curl_handle); curl_close($curl_handle); return $response; } ?>
关键修复点:
- 将
filters参数直接拼入URL,并用urlencode()处理特殊字符 - 移除了
CURLOPT_POSTFIELDS和不必要的Content-Type请求头 - 简化函数参数,直接传递完整URL更清晰
- 添加curl错误捕获逻辑,便于后续排查问题
内容的提问来源于stack exchange,提问作者Christian Rodrigues
相关产品推荐
相关产品推荐

