2017-05-05 57 views
0

Microsoft DataMarket platform retired on April 30, 2017並將Microsoft Translator API移至Azure。Microsoft Translator API遷移後的perl中的get_access_token

他們如何獲得新令牌C# here

我們的老過程一個完整的例子,但是,perl的,我有零經驗。它抓住下面的代碼使用post令牌:

if (!$token or time > $expire - 5) { 
    $token = ''; 
    console_log("Getting a new access token.") if ($debug); 
    my $response = $ua->post(
     "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/", 
     [ 
      client_id  => $clientid, 
      client_secret => $clientsecret, 
      scope   => 'http://api.microsofttranslator.com', 
      grant_type => 'client_credentials', 
     ], 
    ); 
    if ($response->is_success and $response->content =~ /^\{"token_type":".+?","access_token":"(.+?)","expires_in":"(\d+?)","scope":".+?"\}$/) { 
     $token = uri_escape("Bearer $1"); 
     $expire = time + $2; 
     if ($fh) { 
      seek($fh, 0,0); 
      print $fh "expire:$expire\n"; 
      print $fh "token:$token\n"; 
      truncate($fh, tell($fh)); 
     } 
    } else { 
     console_log("Failed to get Access Token.") if ($debug); 
    } 
} 
close $fh if($fh); 
return $token; 
} 

我在想,這可能是因爲改變爲更新的URL和刮老CLIENT_ID和客戶端密鑰,像這樣簡單:

my $response = $ua->post(
     "https://api.cognitive.microsoft.com/sts/v1.0/issueToken", 
     [ 
       //Ocp-Apim-Subscription-Key => newazurekey 
     ], 
    ); 

我有兩個問題,雖然

1)我已經找到並閱讀文檔的網站,一個說 OCP-APIM-認購-Key是一個頭,另一個是對米是代碼Ocp-Apim-Subscription-Key => newazurekey好嗎? Perl允許破折號?

文件地點:onetwothree

2)收到測試API似乎並不具備 token_type:access_token:expires_in:scope:像老 碼的響應

我指的是這種情況

if ($response->is_success and $response->content =~ /^\{"token_type":".+?","access_token":"(.+?)","expires_in":"(\d+?)","scope":".+?"\}$/) 

的反應是這樣的

enter image description here

我在正確的軌道上正確地抓住令牌或將需要進行更多的更改?

+1

'=>'(胖逗號)會自動引用lhs上的無用單詞,因此您需要'Ocp-Apim-Subscription-Key'來開始。你需要解碼響應嗎? –

+0

@SinanÜnür仍然有幫助謝謝 – hellyale

+1

請將您的輸出發佈爲文本。圖像不是很有用。 – Borodin

回答

1

添加

# Sample code uses five minutes 
use constant DEFAULT_TOKEN_LIFETIME => 5 * 60; 

從走馬看,以下可能的工作:

if (!$token or time > $expire - 5) { 
    $token = ''; 
    console_log("Getting a new access token.") if ($debug); 
    my $response = $ua->post(
     "https://api.cognitive.microsoft.com/sts/v1.0/issueToken", 
     [ 
      'Ocp-Apim-Subscription-Key' => $newazurekey, 
     ], 
    ); 
    if ($response->is_success) { 
     $token = "Bearer " . $response->decoded_content; 
     $expire = time + DEFAULT_TOKEN_LIFETIME; 
     if ($fh) { 
      seek($fh, 0,0); 
      print $fh "expire:$expire\n"; 
      print $fh "token:$token\n"; 
      truncate($fh, tell($fh)); 
     } 
    } else { 
     console_log("Failed to get Access Token.") if ($debug); 
    } 
} 
close $fh if($fh); 
return $token; 
} 

comment說令牌生存是十分鐘,但代碼示例使用一個五分鐘的時間間隔:

// Use a duration of 5 minutes, which is less than the actual token lifetime of 10 minutes. 
private static readonly TimeSpan TokenCacheDuration = new TimeSpan(0, 5, 0); 
+0

有與此無關的過程的其他問題,所以我還沒有能夠測試,但我會接受這個答案,因爲我很確定它是正確的。(進程不足以讓我實際測試當前) – hellyale

+0

如果您得到與此相關的特定診斷,請使用任何錯誤/警告的**文本**更新您的問題。 –

+1

目前雖然有人正在研究這個問題,但會做。看起來這個過程似乎並不是在這個時候對令牌或API進行調用。 – hellyale

相關問題