访问SPtrans API,授权对信息请求失败

时间:2014-05-18 15:17:39

标签: php api curl

我试图使用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);

您可以在http://00qq.com/sptrans/index.php

看到这项工作

1 个答案:

答案 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;选项)。