接到任务需要跟换公司现有实时汇率接口的API,但是Xe Currency的官方文档很潦草,找了很多网站都没找到具体的教程,今天特意写一下这个教程,小白快点感谢我吧~~~
Xe Currency Data简介:
Xe Currency Data 是由 Xe 开发的一组 API,旨在提供实时和历史的货币汇率数据。这些 API 可以让开发人员轻松地集成汇率数据到他们的应用程序中,帮助用户在进行跨国交易、旅行或投资时了解实时的汇率情况。
Xe Currency Data API 提供了多种功能,包括:
-
实时汇率数据:可以查询各种货币对之间的实时汇率。
-
历史汇率数据:可以获取过去某个时间点的汇率数据,帮助用户分析汇率走势。
-
汇率转换:可以将一个货币转换为另一个货币,根据实时汇率计算转换后的金额。
-
货币列表:可以获取支持的货币列表,帮助用户了解可用的货币代码和名称
官方文档:Xe Currency Data
可以直接注册获取7天试用期。
注册/获取密钥:
获取到密钥后呢可以去到API文档测试运行是否成功,这里第一个坑来了。
这里点击执行会弹出一个登录框,提示需要输入账号和密码,但是实际需要输入的是API的密钥ID和密钥key。(ps:就很坑!!!)好了,这里已经避坑一个,确认后正常就会在下面显示返回的JSON数据,表示APIKey没问题。
代码部分:
/**
* XE汇率api接口密钥
*/
public static String apiKey = "e0ojrn7dgcg8kqbtiq6ko78r0j";
public static String apiId = "alan913884135";
public static String exchangeRateUrlV3 ="https://xecdapi.xe.com/v1/convert_from.json?from=FROM&to=TO";
/**
* 调用汇率接口
* @param from 源货币
* @param to 目标货币
* @return
* @throws Exception
*/
public static Double currencyChangeV2(String from, String to) throws Exception {
if (from.equals(to)){
return 1D;
}
// 替换url中的from和to,并且发送请求
String url = exchangeRateUrlV3.replace("FROM", from).replace("TO", to);
JSONObject jsonObject = httpGetRequestV3(url);
Double exchangeRate = 0D;
if (null != jsonObject) {
System.out.println("调用汇率转换接口:" + jsonObject);
//
if (jsonObject.get("code")!=null) {
throw new BizException(BizCodeEnum.ILLEGAL_REQUEST, "调用汇率转换接口失败!!!原因:" + jsonObject.getString("message"));
} else {
// 返回值 jsonObject = {"terms":"http://www.xe.com/legal/dfs.php","privacy":"http://www.xe.com/privacy.php","from":"USD","amount":1,"timestamp":"2024-03-20T00:00:00Z","to":[{"mid":7.1990197127,"quotecurrency":"CNY"}]}
// 这里只获取了mid的值(汇率)
exchangeRate = (jsonObject.getJSONArray("to").getJSONObject(0).getDouble("mid"));
}
}
return exchangeRate;
}
/**
* Xe Currency Data API 汇率转换接口
* 发送请求,插入请求头
* @param requestUrl
* @return
* @throws Exception
*/
public static JSONObject httpGetRequestV3(String requestUrl) throws Exception {
CloseableHttpClient httpClient = HttpClients.custom().build();
// 拼接好的apiId和apiKey 转换成Base64编码 设置到 Authorization 请求头中
String auth = apiId + ":" + apiKey;
byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes());
String authHeaderValue = "Basic " + new String(encodedAuth);
HttpGet httpGet = new HttpGet(requestUrl);
httpGet.setHeader("Authorization", authHeaderValue);
CloseableHttpResponse response = httpClient.execute(httpGet);
return JSON.parseObject(EntityUtils.toString(response.getEntity()), JSONObject.class);
}
最后说一下做这个小功能遇到的坑,其实如果官方文档详细一点点的话是完全可以避免的。
Xe API文档内的调用接口全部都是只给了一个接口,并没有明确表示需要用什么方式去将ID和key插入进去,于是我尝试了使用路径变量和JSON变量都不行。
最后我是通过监测测试调用的链接,对比里面传输的参数才知道,原来是要将
apiId和apiKey拼接好然后转换成Base64编码 设置到 Authorization 请求头中才可以正常调用!!!!这里我直接反编译解码了Authorization才恍然大悟~~~~
这里真的只是在API文档加一句话的事情,但是就是没有~~~~~