每天调用接口,比如支付的,还有天气预报的,这些大部分的接口都有java的demo。直接拷贝过来就能使用了。
但是这次搜狗他老人家的API很不和谐,用的是PHP做的demo,其他都没了。
搜狗的翻译系统的网址:http://ai.sogou.com/ai-docs/api/translate
对于我这种小白级别的Java程序员看的很累,花了三个小时才完成。为了帮助大家我把我的代码贡献出来,不说什么直接上代码。
//测试搜狗的API /** * 1.应用相关前缀 pre * 2.请求相关数据 calc * 3.生成签名 sign * 4.生成认证信息, 通过 Authorization header, 发送请求接口 */ @Test public void testTranslateAPI() { try( CloseableHttpClient httpClient = HttpClients.createDefault(); ) { //控制台中的密钥 String ak = ""; String sk = ""; //原始语言 String from = "zh-CHS"; //目标翻译语言 String to = "en"; //HTTP请求方式 String method = "GET"; //输入的语言 String q = rawurlencode("吃饭了吗?"); //请求的url String url = "http://api.ai.sogou.com/pub/nlp/translate?q="+q+"&from="+from+"&to="+to; //从url获得下面的信息用于加密 String host = "api.ai.sogou.com"; String path = "/pub/nlp/translate"; //请求参数 String query = "q="+q+"&from="+from+"&to="+to; //排列后的请求参数 String arg = "from="+from+"&q="+q+"&to="+to; //签名的前缀 String pre = "sac-auth-v1/"+ak+"/"+System.currentTimeMillis()/1000+"/3600"; //签名的数据 String calc = pre+ "\n"+"GET"+"\n"+"api.ai.sogou.com"+"\n"+"/pub/nlp/translate"+"\n"+arg; //根据签名的前缀和数据生成对应的密钥 String hmac = sha256_HMAC(calc, sk.getBytes(StandardCharsets.UTF_8)); //生成的hmac生成最终码 String sign = pre +"/"+ hmac; HttpGet httpGet = new HttpGet(url); httpGet.addHeader("Content-Type", "application/json"); httpGet.addHeader("Authorization", sign); HttpResponse response = httpClient.execute(httpGet); System.out.println(response.getStatusLine().getStatusCode()); System.out.println(EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8)); } catch (Exception e) { e.printStackTrace(); } } //php中的urlencode private static String rawurlencode(String query) { String queryCode = null; try { queryCode = URLEncoder.encode(query, String.valueOf(StandardCharsets.UTF_8)).replace("*", "%2A"); } catch (Exception e) { e.printStackTrace(); } return queryCode; } //密钥生成 private static String sha256_HMAC(String message, byte[] secret) { String hash = ""; try { Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(secret, "HmacSHA256"); sha256_HMAC.init(secret_key); byte[] bytes = sha256_HMAC.doFinal(message.getBytes(StandardCharsets.UTF_8)); hash = new String(java.util.Base64.getEncoder().encode(bytes), StandardCharsets.UTF_8); // hash = org.apache.commons.codec.binary.Base64.encodeBase64String(bytes); System.out.println(hash); } catch (Exception e) { System.out.println("Error HmacSHA256 ===========" + e.getMessage()); } return hash; }
注:这些代码在生产环境下测试通过。如果存在错误或者建议欢迎邮件: [email protected]