我正在开发一个接口,在该接口中,我接收一整组事件数据,为另一个系统做好准备,并通过基于web的API将其推送到系统中。
接收和处理数据很好,但当使用cURL时,将数据推送到其他系统会失败。querystring中的最后一个参数似乎丢失了。
我怎么知道?接口响应并告诉我缺少一个强制参数。它似乎总是最后一个。
这就是我构建查询字符串的方式(缩短一点)
$URI = 'http://remote-interface-host/serviceurl?';
$querystring .= 'city='.urlencode(utf8_decode($town));
$querystring .= '&street='.urlencode(utf8_decode($street));
$querystring .= '&location='.urlencode(utf8_decode($location));
$querystring .= '&start='.$start;
$querystring .= '&end='.$end;
$querystring .= '&text='.urlencode(utf8_decode(trim($description)));
$querystring .= '&title='.urlencode(utf8_decode(trim($title)));
$querystring .= '&website='.urlencode(utf8_decode($website));
$textlanguage = '&languageid=1522908220065994400';
$querystring .= $textlanguage;
$fullcurl = $URI.$querystring;
$data = docurlcall($fullcurl);
docurlcall()
也很简单
function docurlcall($url)
{
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => 0,
CURLOPT_TIMEOUT => 10,
CURLOPT_URL => $url,
CURLOPT_POST => 1,
CURLOPT_USERAGENT => 'my-interface'
));
$result = json_decode(curl_exec($curl));
curl_close($curl);
return $result;
}
来自远程接口的反馈是
{ "success":false, "message":"missing required parameter 'languageid'", }
据我所见,这应该是对cURL的一个很好的使用,所以我不明白他为什么删除最后一个参数。但也许这只是一些不同问题的症状。
有什么想法可能是错误的或缺失的吗
注意:我一直使用cURL,因为外部接口的开发人员担心get请求的数据可能会太大(为了更好的可读性,我删除了图像和更多信息),所以我必须使用cURL进行POST请求
取消查询字符串生成并让PHP为您完成工作不是更好的设置吗?
$parameters = array(
'city' => urlencode(utf8_decode($town)),
'street' => urlencode(utf8_decode($street)),
'location' => urlencode(utf8_decode($location)),
'start' => $start,
'end' => $end,
'text' => urlencode(utf8_decode(trim($description))),
'title' => urlencode(utf8_decode(trim($title))),
'website' => urlencode(utf8_decode($website)),
'languageid' => '1522908220065994400'
);
$data = docurlcall(
sprintf(
"%s?%s",
"http://remote-interface-host/serviceurl",
http_build_query($parameters)
)
);
这可以导致更简单的bug搜索(至少更干净的代码会让我获得更简单的错误捕获:)。