0

在调用 Microsoft 翻译服务之前,您需要一个令牌。我正在尝试按照 这些说明的第 3 步进行操作。需要调用令牌服务来获取令牌。我有一个 clientId 和秘密通行证。我查看了服务http://api.microsofttranslator.com/V2/soap.svc的签名。我可以看到一个 GetAppIdToken方法。它的签名与文档所暗示的完全不同。

有人知道说明页面上提到了什么服务操作吗?WSDL 和文档似乎不匹配。还有其他服务吗?

说明


说明如何解决问题

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

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

4

2 回答 2

2

本文中包含的代码示例显示了如何执行此操作。您必须对其进行深入研究才能弄清楚它们是如何组合在一起的,但简而言之,他们使用WebRequest带有“POST”方法的 a 并在该 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是示例中定义的类,具有返回值的属性:

访问令牌
令牌类型
过期日期在
范围

这是一个非常全面的样本,需要进行少量挖掘才能获得相关部分,但据我所知,它们都在那里。为简单起见,我发布的片段只是简单地结合了示例中其他地方所做的几件事。

于 2013-05-11T07:56:21.777 回答
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 请求的 URL 中发送参数,您将获得Bad Request (400)带有以下描述的 aACS90004: The request contains 1 tokens separated by \u0027=\u0027 instead of a single key value pair.这就是为什么使用requestsone 指定data而不是的原因params

于 2015-12-11T23:47:56.390 回答