2013-09-17 2 views
1

, пожалуйста, вы можете помочь. Я пытаюсь получить билет с сервера таблицы через PHP. В настоящее время мой ISP и мой IP-адрес сервера перечислены как доверенные IP-адреса на серверах tableau. Если я использую javascript на своем удаленном сервере, тогда я получаю билет, но по какой-то причине я не могу получить никакого результата с PHP и попробовал ряд фрагментов кода php. Если я смогу заставить кого-нибудь из них работать, я с радостью сделаю расколы.Таблица получить билет с PHP

NB: В версии javascript мне нужно ввести target_site, который совпадает с именем пользователя, иначе я не получаю результат. Также обратите внимание на порт: 8000 в конце URL-адреса.

Это рабочий 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> 

Вот мой код, фрагмент 1 с помощью file_get_contents

$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; 

Другой фрагмент кода с помощью завиток

$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

$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; 

Много Большое спасибо заранее ...

ответ

1

Tableau имеет PHP пример, который работает (он работает на моей машине, как я типа). Ты это пробовал?

Это сообщение на самом деле относится к тому же образец кода и расширяет это просто прикосновение, так что можно назвать путем JS:

Generate tableau trusted ticket using AJAX

В примере кода в вопрос можно найти в:

C: \ Program Files (x86) \ Tableau \ Tableau Server \ 8.0 \ Extras \ вложение \ PHP

Он выглядит очень похож на ваш, но стойкам при помощи 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; 
} 

?> 
+0

Спасибо Рассел, я дал этот код безрезультатно. Похоже, мне, возможно, придется отлаживать завиток. – uknowit2

0

Извините, кажется, что мой веб-хост блокировал порт 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; 
0

С вашим предложением, я использовал 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); 
} 
Смежные вопросы