訪問令牌類似於web中的cookie
我在這裡畫了一張圖來展示業務邏輯
在我們呼叫microsoft translator server之前需要獲得令牌,而且這個令牌的有效期為10分鐘。下表列出所需的引數和對於的說明
引數 | 描述 |
client_id | 必須的,指你在Azuzre註冊應用程式的客戶端ID |
client_secret | 必須的,指你在Azuzre註冊應用程式的客戶端金鑰 |
scope | 必須的,預設使用http://api.microsofttranslator.com |
grant_type | 必須的,預設使用"client_credentials" |
Azure返回給我們的也是四個屬性,並且以json的形勢返回,下表列出屬性和對應的描述
屬性 | 描述 |
access_token | 驗證您可以訪問 Microsoft 翻譯 API 訪問令牌 |
token_type | 訪問令牌的格式。 |
expires_in | 訪問令牌無效的秒數 |
scope | 此標記為有效的域。對於微軟翻譯 API,域名是http://api.microsofttranslator.com。 |
Bing AppID 機制已廢棄,不再受支援。如上文所述,您必須獲取訪問令牌來使用微軟翻譯 API。訪問令牌是更安全,並且訪問的令牌在規定時間內可以被後續程式呼叫
注意以下兩點
1.使用"Bearer"+access_toke的值作為訪問令牌
2.令牌有效期為10分鐘,過期了需要重新申請
下面來使用類AdmAccessToken,使用它來儲存Azure返回的屬性
[DataContract]
class AdmAccessToken
{
[DataMember]
public string access_token { get; set; } [DataMember]
public string token_type { get; set; } [DataMember]
public string expires_in { get; set; } [DataMember]
public string scope { get; set; } }
這個類的四個屬性的Azure返回的屬性相對應,並加入[DataContract][DataMember]方面對返回的json序列化成AdmAccessToken的物件
接下來使用一個類AdmAuthentication,使用它來幫助我們完成令牌的請求
public class AdmAuthentication
{
public static readonly string DatamarketAccessUri = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13";
private string clientId { get; set; }
private string clientSecret { get; set; }
private string scope { get; set; }
private string grant_type { get; set; }
private string request { get; set; }
public AdmAccessToken token { get; set; } public AdmAuthentication(string clientId, string clientSecret)
{
this.clientId = clientId;
this.clientSecret = clientSecret;
this.request = string.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=http://api.microsofttranslator.com", HttpUtility.UrlEncode(clientId), HttpUtility.UrlEncode(clientSecret));
this.token = HttpPost(DatamarketAccessUri, this.request);
}
private AdmAccessToken HttpPost(string DatamarketAccessUri, string requestDetails)
{
//Prepare OAuth request
WebRequest webRequest = WebRequest.Create(DatamarketAccessUri);
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.Method = "POST";
byte[] bytes = Encoding.ASCII.GetBytes(requestDetails);
webRequest.ContentLength = bytes.Length;
using (Stream outputStream = webRequest.GetRequestStream())
{
outputStream.Write(bytes, 0, bytes.Length);
}
using (WebResponse webResponse = webRequest.GetResponse())
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(AdmAccessToken));
//Get deserialized object from JSON stream
AdmAccessToken token = (AdmAccessToken)serializer.ReadObject(webResponse.GetResponseStream());
return token;
} }
}
好了,現在完成了令牌的請求,接下來可以利用令牌獲取翻譯服務了