HTTP请求正确发送但返回错误的值/结果

时间:2017-08-23 19:00:31

标签: java apache http bing microsoft-cognitive

我尝试使用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个键)

1 个答案:

答案 0 :(得分:0)

让v7.0开始工作的答案:

  

v5.0不是这种情况。我从Azure门户获取了正确的密钥。 (名为Keys的页面,列出了您可以使用和重新生成的2个键)

每个版本有2个键。因此,如果你看到2个密钥,它们可能都是v5.0。它应该明确提到v7.0。 应该有不同的部分,也有不同的端点。 将它们相互结合使用可获得理想的效果。