我试图使用SPtrans API(http://www.sptrans.com.br/desenvolvedores/APIOlhoVivo.aspx),该API应该为圣保罗(巴西)地区提供公共交通信息。
我试图使用PHP并卷曲。
我能够提交请求并且可以对自己进行身份验证(向/ Login / Autenticar发送请求?token = {token}。邮件请求返回“真实”(&)只有一个真实的')。 (似乎我需要将令牌作为GET和POST。)
但是,如果我然后输入信息(GET)请求,例如/ Linha / Buscar?termosBusca = {termosBusca},我得到一致的返回"此请求已拒绝授权。 #34;消息。
你可以看到这个(不是)工作在:
http://00qq.com/sptrans/index.php
对此的任何想法或想法都会非常有帮助。
以下是获取数据的代码:
function getResult($accesspoint, $page, $postData, $post = true) {
$ch = curl_init();
$t = http_build_query($postData);
$url = $accesspoint.$page."?".$t;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if ($post == true) {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
}
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
curl_close($ch);
$output = object_to_array(json_decode($output));
return $output;
}
更新
@chesterbr让我走上正轨:我必须在认证时创建,收集和存储cookie,然后在后续请求中使用它们。以下是概念证明。
$site["sptrans"]["accesspoint"] = "http://api.olhovivo.sptrans.com.br/v0";
$site["sptrans"]["page"]["Login"] = "/Login/Autenticar";
$site["sptrans"]["page"]["Parada"] = "/Parada/Buscar";
$site["sptrans"]["page"]["Linha"] = "/Linha/Buscar";
$site["sptrans"]["token"] = ""; //This should contain your token.
error_reporting(E_ALL);
ini_set('display_errors', 1);
function object_to_array($data) {
if (is_array($data) || is_object($data)) {
$result = array();
foreach ($data as $key => $value)
$result[$key] = object_to_array($value);
return $result;
}
return $data;
}
function getResult($accesspoint, $page, $postData, $cookie, $post = true) {
$ch = curl_init();
$t = http_build_query($postData);
$url = $accesspoint.$page."?".$t;
// print $url."<br />";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie);
// curl_setopt($ch, CURLOPT_COOKIESESSION, true);
if ($post == true) {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
}
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
curl_close($ch);
$output = object_to_array(json_decode($output));
return $output;
}
//Create a cookie for the duration of the page.
$ckfile = tempnam ("cache/cookies", "spt.");
print "Authentication<br />";
$postData["token"] = $site["sptrans"]["token"];
$output = getResult($site["sptrans"]["accesspoint"], $site["sptrans"]["page"]["Login"], $postData, $ckfile);
print_r ($output);
unset($postData);
print "<hr />";
print "Linha<br />";
$postData["termosBusca"] = "8000";
$output = getResult($site["sptrans"]["accesspoint"], $site["sptrans"]["page"]["Linha"], $postData, $ckfile, false);
print_r ($output);
unset($postData);
print "<hr />";
print "Parada<br />";
$postData["termosBusca"] = "Afonso";
$output = getResult($site["sptrans"]["accesspoint"], $site["sptrans"]["page"]["Parada"], $postData, $ckfile, false);
print_r ($output);
unset($postData);
print "<hr />";
//Delete the cookie
unlink($ckfile);
看到这项工作
答案 0 :(得分:1)
API要求您存储来自身份验证调用的cookie并将其包含在后续的cookie中(否则,服务器无法知道这些调用属于同一会话,因为默认情况下HTTP是无状态的)。
您可以通过按照https://stackoverflow.com/a/12885587中所述配置cURL库来在PHP中实现此目的。有关此类选项的更多信息,请参阅http://www.php.net/manual/en/function.curl-setopt.php(搜索&#34; COOKIE&#34;选项)。