【问题标题】:Tableau get ticket with PHPTableau 使用 PHP 获取票证
【发布时间】:2013-09-17 07:15:36
【问题描述】:

请您帮忙。我正在尝试通过 PHP 从画面服务器获取票证。目前,我的 ISP 和我的服务器 IP 地址在 tableau 服务器上列为受信任的 IP。如果我在远程服务器上使用 javascript,那么我会得到票,但由于某种原因,我无法使用 PHP 获得任何结果,并且尝试了一系列 php 代码 sn-ps。如果我能让他们中的任何一个工作,我会很高兴地完成拆分。

注意:在 javascript 版本中,我需要输入与用户名相同的 target_site,否则我不会得到结果。还要注意网址末尾的 :8000 端口。

这是有效的 html/javascript 版本(返回有效票证,例如 128018285):

<script type="text/javascript">
function submitForm(){document.getElementById('form1').action = document.getElementById('server').value + "/trusted";}
</script>                      
<form method="POST" id="form1" onSubmit="submitForm()">
    <table class="style1">
        <tr>
            <td class="style2">
                Username:</td>
            <td>
                <input type="text" name="username" value="" /></td>
        </tr>
        <tr>
            <td class="style2">
                Server: </td>
            <td>
                <input type="text" id="server" name="server" value="http://" /></td>
        </tr>
        <tr>
            <td class="style2">
                Client IP (optional):</td>
            <td>
                 <input type="text" id="client_ip" name="client_ip" value="" /></td>
        </tr>
        <tr>
            <td class="style2">
                Site: (leave blank for Default site, else NameOfSite if using sites)</td>
            <td>
                <input type="text" id="target_site" name="target_site" value="" /></td>
        </tr>
        <tr>
            <td class="style2">
                        <input type="submit" name="submittable" value="Go" /></td>
            <td>
                 </td>
        </tr>
    </table>
</form>

这是我的代码,使用 file_get_contents 的 sn-p 1

$remote_addr = $_SERVER['REMOTE+ADDR'];  
  $params = array(
    'username' => 'myusername',
    'client_ip' => $remote_addr,
    'target_site' => 'myusername'
   );

    $context = stream_context_create($params);
    $ticket = file_get_contents('http://mysite.com:8000/trusted', false, $context);

  if ($ticket > 0) {
     return $ticket;
  }
  else
    return 0;

另一个使用 curl 的代码 sn-p

$server = 'myserver.com:8000';
$url = 'http://'.$server.'/trusted';
$fields_string ='target_site=myusername&username=myusername';

$ch = curl_init();      
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept-Encoding: gzip'));
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);

return curl_exec($ch);      
curl_close($ch);

另一个使用 fopen 的代码 sn-p

$url = 'http://myserver.com:8000/trusted';
$data = array ('username' => 'myusername','target_site' => 'myusername', 'format' => 'txt');
$data = http_build_query($data);
$params = array('http' => array(
                        'method' => 'POST',
                        'content' => $data,
                         'header'  => 'Content-type: application/x-www-form-urlencoded' . "\r\n"
              .'Accept-Encoding:' . "\r\n"
                    ));
        if($optional_headers != null)
        {
            $params['http']['header'] = $optional_headers;
        }
        $ctx = stream_context_create($params);
        $fp = @fopen($url, 'rb', false, $ctx);
        if (!$fp)
        {
            throw new Exception("Problem with $url, $php_errormsg");
        }
        $response='';
        while (!feof($fp))
        {
            $response = $response.fgets($fp);
        }
        if ($response === false)
        {
            throw new Exception("Problem reading data from $url, $php_errormsg");
        }

        fclose($fp);
        return $response;

非常感谢提前...

【问题讨论】:

    标签: php curl fopen file-get-contents tableau-api


    【解决方案1】:

    Tableau 有可以运行的示例 PHP(它在我键入时在我的机器上运行)。你试过了吗?

    这篇文章实际上引用了相同的示例代码,并对其进行了扩展,以便可以通过 JS 调用:

    Generate tableau trusted ticket using AJAX

    有问题的示例代码可以在以下位置找到:

    C:\Program Files (x86)\Tableau\Tableau Server\8.0\extras\embedding\php

    它看起来和你的很相似,但是 POST 使用 http_post_fields()

        <?php
    
    // Returns a trusted URL for a view on a server for the
    // given user.  For example, if the URL of the view is:
    //    http://tabserver/views/MyWorkbook/MyView
    //
    // Then:
    //   $server = "tabserver";
    //   $view_url = "views/MyWorkbook/MyView";
    //
    function get_trusted_url($user,$server,$view_url) {
      $params = ':embed=yes&:toolbar=yes';
    
      $ticket = get_trusted_ticket($server, $user, $_SERVER['REMOTE_ADDR']);
      if($ticket > 0) {
        return "http://$server/trusted/$ticket/$view_url?$params";
      }
      else 
        return 0;
    }
    
    // Note that this function requires the pecl_http extension. 
    // See: http://pecl.php.net/package/pecl_http
    
    // the client_ip parameter isn't necessary to send in the POST unless you have
    // wgserver.extended_trusted_ip_checking enabled (it's disabled by default)
    Function get_trusted_ticket($wgserver, $user, $remote_addr) {
      $params = array(
        'username' => $user,
        'client_ip' => $remote_addr
      );
    
      return http_parse_message(http_post_fields("http://$wgserver/trusted", $params))->body;
    }
    
    ?>
    

    【讨论】:

    • 感谢 Russell,我尝试了这段代码,但没有成功。看起来我可能需要调试 curl。
    【解决方案2】:

    抱歉,我的虚拟主机似乎阻止了端口 8000,这就是代码无法正常工作的原因。

    作为参考,这是最简洁的一段代码,可以改变你自己的变量,myusername,mytargetsite,http://example.com/trusted

    $opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/x-www-form-urlencoded',
        'content' => 'username=myusername&target_site=mytargetsite'
    )
    );
    
    $context  = stream_context_create($opts);
    
    $result = file_get_contents('http://example.com/trusted', false, $context);
    
    if ($result === false) {
    
    throw new Exception("Problem reading data from $url, $php_errormsg");
    }
    
    else echo $result;
    

    【讨论】:

      【解决方案3】:

      根据您的建议,我使用了cURL 请求,并通过cURL 请求解决了您的问题,如下所示:

      function get_trusted_ticket($wgserver, $user, $remote_addr) {
          $server = $wgserver;
          $url = 'http://'.$server.'/trusted';
          $fields_string ='target_site=$remote_addr&username=$user';
      
          $ch = curl_init($url);
          $data = array('username' => $user, 'client_ip' => $remote_addr);
      
          curl_setopt($ch, CURLOPT_POST, true); 
          curl_setopt($ch,CURLOPT_POSTFIELDS, $data);
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      
          return curl_exec($ch);      
          curl_close($ch);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-27
        • 1970-01-01
        • 1970-01-01
        • 2013-12-07
        相关资源
        最近更新 更多