调用Microsoft翻译服务:如何调用get token服务?

时间:2013-05-11 05:37:00

标签: wcf microsoft-translator

在调用Microsoft翻译服务之前,您需要一个令牌。 我正在尝试关注step 3 of these instructions。需要调用令牌服务才能获得令牌。我有一个clientId和秘密通行证。我查看了服务http://api.microsofttranslator.com/V2/soap.svc的签名。 我可以看到GetAppIdToken方法。它的签名与文档所暗示的完全不同。

是否有人知道指令页面上提到的服务操作? WSDL和文档似乎不匹配。还有其他服务吗?

The instructions


如何解决问题的说明

编辑:我在WEB上找到了这个工具来帮助跟踪应该运行的流量 http://oauthdevconsole.cloudapp.net/PartialOAuth

EDIT2:更好地解释如何在此注册 http://blogs.msdn.com/b/translation/p/gettingstarted1.aspx

2 个答案:

答案 0 :(得分:2)

文章中包含的代码示例显示了如何执行此操作。你必须仔细研究一下它是如何结合在一起的,但简而言之,他们使用WebRequest方法" POST"并在该POST中传递4个必需值。我建议查看示例代码,但要将其提炼为基本元素,它可能看起来像这样:

string request = string.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=http://api.microsofttranslator.com", HttpUtility.UrlEncode(clientId), HttpUtility.UrlEncode(clientSecret));
WebRequest webRequest = WebRequest.Create("https://datamarket.accesscontrol.windows.net/v2/OAuth2-13");
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.Method = "POST";
byte[] bytes = Encoding.ASCII.GetBytes(request);

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

以上代码中的大部分都是样本中的private AdmAccessToken HttpPost(string DatamarketAccessUri, string requestDetails)方法。

AdmAccessToken是样本中定义的类,它具有返回值的属性:

access_token
token_type
expires_in
scope

这是一个非常全面的样本,并且需要进行少量挖掘才能获得相关部分,但它的全部内容尽可能接近。我发布的代码片段简单地结合了样本中其他部分所做的一些事情,以简化。

答案 1 :(得分:0)

获取令牌的Python代码:

import requests
import urllib

data = dict(
    client_id='client_id',
    client_secret='client_secret',
    scope='http://api.microsofttranslator.com',
    grant_type='client_credentials'
)
resp = requests.post(url='https://datamarket.accesscontrol.windows.net/v2/OAuth2-13', data=urllib.urlencode(data))

注意:如果您在执行POST请求的网址中发送参数,您将获得Bad Request (400),其中包含以下说明ACS90004: The request contains 1 tokens separated by \u0027=\u0027 instead of a single key value pair.这就是使用requests一个指定data的原因而不是params

相关问题