前言
大家好,我是南城、有潇湘,一个有点文学气息的Java小白,如果我得文章对您有所帮助,不胜荣幸!!!
项目场景:
当我们进行微信小程序开发的时候,有时候避免不了需要去和其他项目进行对接,去调用其他项目的接口,但是由于微信小程序规则的限制,前端没办法访问外部链接,这个时候就需要后端对接口进行处理之后将数据交给前端.
问题描述:
①后端如何调用外部接口?
②如何在第三方接口有权限认证的情况下动态处理?
问题分析:
①首先我们确定一下我们需要什么以及我们有什么和没有什么,我们需要的是接口返回的数据,把这个被调用的接口比作一个房子,我们有的就是通往这个房子的路线以及一块敲门砖(条件),我们没有的就是门后屋子里的一切东西我们都不知道.这就好比我们和屋子各是一个服务器,我们需要的是服务器之间的数据交换,那么这个时候io流是不是就可以解决这个问题呢?
解决方案:
对于后端来说,我们可以效仿我们平时写测试类的思路,我们需要搞定被调用需要的东西传给它,然后拿到它返给我们的数据.
@GetMapping("getFcstlnRegion")
public String getFcstlnRegion() throws Exception{
URL url= new URL("外部链接");
BufferedReader in = new BufferedReader(
new InputStreamReader(
url.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
return inputLine;
}
我们先写一个简单的io流,试着去访问一下:
我们通过返回结果可以看到,我们确实访问到了,但是却不被认可,被赶出来了,那么我们现在就要去获得认可.根据返回信息我们看到,我们的访问ip不合法.首先我们知道,我们的本机应该有三个地址:本地地址,局域网地址,以及外网地址.我们既然去访问的第三方服务器,毫无疑问应该使用我们的外网地址,很多网站都可以获取到我们的外网地址,比如http://ip.chinaz.com/或者http://pv.sohu.com/cityjson?ie=utf-8都可以.但是我们不可能写死,因为服务器地址变化的几率并不小,那么我们是否可以动态的去获取我们的外网IP?我们使用和刚才一样的方法,我们通过io流去访问查询外网ip的网站,去读取到返回的信息:
//获取外网ip
public static String getV4IP(){
String ip = "http://pv.sohu.com/cityjson?ie=utf-8";
String inputLine = "";
String read = "";
try {
URL url = new URL(ip);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
while ((read = in.readLine()) != null) {
inputLine += read;
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(inputLine);
return inputLine;
}
public static void main(String[] args) {
getV4IP();
}
我们运行getV4IP()方法查看返回,打印返回结果,发现返回的是一个固定的字符串:
我们可以清楚的看到我们需要的ip地址确实拿到了,但是同时还有一些我们不需要的东西,这个时候就简单了,既然返回的格式是固定的,那么我们只需要对字符串进行简单的切割处理就好了:
//获取外网ip
public static String getV4IP(){
String ip = "http://pv.sohu.com/cityjson?ie=utf-8";
String inputLine = "";
String read = "";
try {
URL url = new URL(ip);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
while ((read = in.readLine()) != null) {
inputLine += read;
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(inputLine);//var returnCitySN = {"cip": "111.57.0.50", "cid": "CN", "cname": "CHINA"};
String substring = inputLine.substring(28, 39);
System.out.println("外网ip:"+substring);//111.57.0.50
return substring;
}
public static void main(String[] args) {
getV4IP();
}
我们再打印一下切割后的结果:
我们就拿到了我们需要的东西.我们再去拿着敲门砖找房子:
我们再次访问的时候,发现我们被识别了,并成功拿到了我们想要的数据.
果然,io流传输界万能的神.我这里用到的是IP,类似的其他的都可以类比的去实现.
一点点的文学气息
**文学小提问:**世人皆知春宵一刻值千金,你知道下一句所为何吗?
**寄语:**大鹏一日同风起,扶摇直上九万里。
**作者笔录:**诸君既有登天揽月之志,即无高踏之台给吾上乎?然今高踏之台,如池塘戏鱼虾之流,食饥之道,非吾之愿也。吾之志,上可登临望月辰,下可临渊观蛟龙,月辰不可触,亦上而抚之,蛟龙不可戏,亦下而降之。诸君年少乎?若年少,不可贪于池塘斤斤肥鱼而步不离,望北冥浩瀚而却步。守而鱼之,终有尽时,不若动而渔之,无穷尽矣。非乎?亦持老骥伏枥之心,汉升壮哉之志。吾之志,有其心而动,诸君共勉。