我尝试使用GET请求向bing的拼写检查api发送http请求。我在https://www.hurl.it/检查了我的参数和标题,并且它正确地返回了一个正确的拼写错误的json,但是当我从我的java应用程序发送请求时,它返回此json,没有检测到拼写错误(因此,文本参数HAS到某种程度上是空的)。我确实在标题中传递了正确的密钥,因为该部分没有发送错误,代码是200(成功)。
我的字符串:"我的玩家正在伤害我"
我的代码返回了:
{"_type":"SpellCheck","flaggedTokens":[]}
Hurl.it回复:
{
"_type":"SpellCheck",
"flaggedTokens":[
{
"offset":3,
"token":"funger",
"type":"UnknownToken",
"suggestions":[
{
"suggestion":"finger",
"score":0.903614003311793
}
]
},
{
"offset":13,
"token":"harting",
"type":"UnknownToken",
"suggestions":[
{
"suggestion":"hurting",
"score":0.903614003311793
}
]
}
]
}
这是我使用Apache的HTTPClient库的java代码: (注意:" command.getAfter()"是我上面提到的传递的字符串。我调试它,甚至硬编码一个字符串来测试它。明显相同的输出。)
HttpClient httpclient = HttpClients.createDefault();
try {
URIBuilder builder = new URIBuilder("https://api.cognitive.microsoft.com/bing/v5.0/spellcheck/");
builder.setParameter("text", command.getAfter());
URI uri = builder.build();
HttpGet request = new HttpGet(uri);
request.setHeader("Ocp-Apim-Subscription-Key", "XXXXXXXX");
HttpResponse response = httpclient.execute(request);
HttpEntity entity = response.getEntity();
if (entity != null) {
System.out.println(EntityUtils.toString(entity));
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
编辑:事实证明,请求对象中返回的URI返回: https://api.cognitive.microsoft.com/bing/v5.0/spellcheck/?text=my+funger+is+harting+me
那么参数不是空的?但是当在hurl.it中没有输入文本参数时,api会返回无参数的错误。当text参数是一个空格" ",它返回与我相同的结果。不确定这意味着什么,因为URI似乎是有效的而不是空的,我的订阅密钥正常工作,因为如果它不是......那么我会收到错误。
编辑:我开始怀疑Apache库忽略了我在HttpGet(uri)中传递的参数。我不确定,但我会尝试使用不同的解决方案来发送带有标题的请求,看看会发生什么。
编辑:我尝试了以下代码:
String url = "https://api.cognitive.microsoft.com/bing/v5.0/spellcheck/?text=" + command.getAfter().replace(" ", "+");
try {
URL request_url = new URL(url);
//URIBuilder uri = new URIBuilder("https://api.cognitive.microsoft.com/bing/v5.0/spellcheck/");
//uri.setParameter("text", command.getAfter());
HttpURLConnection con = (HttpURLConnection) request_url.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("Ocp-Apim-Subscription-Key", Keys.BING_SPELL_CHECK_API);
con.setConnectTimeout(100000);
con.setReadTimeout(100000);
con.setInstanceFollowRedirects(true);
String theString = IOUtils.toString(con.getInputStream(), "UTF-8");
System.out.println(theString);
} catch (IOException e) {
e.printStackTrace();
}
它返回的结果与Apache的结果相同......:/我还应该尝试什么?
编辑: 这也是请求的输出:
https://api.cognitive.microsoft.com/bing/v5.0/spellcheck/?text=my+funger+is+hartingme - [Ocp-Apim-Subscription-Key: <XXXXXXXXXXXX>]
HTTP/1.1 200 OK - en_US
{"_type": "SpellCheck", "flaggedTokens": []}
我不明白....当hurl.it为同一个请求返回正确的json时,为什么json输出为空?这是一个java问题吗?
编辑: 我刚刚尝试过UniRest的api。完全相同的结果......我在这里做错了什么?! 我迷路了...
单独发行: 我想要注意以下内容:当我将bing api的版本设置为7.0时,我收到以下错误:
Received http status code 401 with message Access Denied and body {"message":"Access denied due to invalid subscription key. Make sure to provide a valid key for an active subscription.","statusCode":401}
v5.0不是这种情况。我从Azure门户获取了正确的密钥。 (名为Keys的页面,列出了可以使用和重新生成的2个键)
答案 0 :(得分:0)
让v7.0开始工作的答案:
v5.0不是这种情况。我从Azure门户获取了正确的密钥。 (名为Keys的页面,列出了您可以使用和重新生成的2个键)
每个版本有2个键。因此,如果你看到2个密钥,它们可能都是v5.0。它应该明确提到v7.0。 应该有不同的部分,也有不同的端点。 将它们相互结合使用可获得理想的效果。