我是看别人的视频觉得有趣,所以就尝试写一下。
本文也只提供灵感。
本地访问—>云函数—>目标网站
相当于云函数只是做了一个请求代理的功能,实现起来非常简单。
因为云函数的损耗低,且有一定的免费额度,重要的是云厂商ip多,这就有了很好的条件。
网上视频:
我看的是他的视频,他用的是GO语言,好处是在服务端节省资源。
直接打开思路,然后我就动手了。(中途连请求和响应都忘记用啥注解了,还是问的GPT才想起来)
阿里云:
直接访问云函数控制台(没有就开通一个):
https://fcnext.console.aliyun.com/overview
新用户还有免费的额度(老用户的差不多快用完了)。
创建服务、创建函数。(理解为文件夹和文件的关系就好了)
如何创建并使用云函数可以查看我的这篇文章(本文不再赘述):
云函数
代码演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| @Controller @ResponseBody public class ProxyController { @GetMapping("/get") public String get(String url){ try { URL urls = new URL(url); HttpURLConnection conn = (HttpURLConnection) urls.openConnection(); conn.setRequestMethod("GET"); if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; StringBuffer content = new StringBuffer(); while ((inputLine = in.readLine()) != null) { content.append(inputLine); } in.close(); conn.disconnect(); return content.toString(); } } catch (Exception e) { e.printStackTrace(); } return "{code:404;string:'未知错误'}"; }
@PostMapping("/post") public String post(@RequestBody() String body){ System.out.println("body==> "+body); JSONObject jsonObject = new JSONObject(body); String url = jsonObject.getString("url"); String requestBody = jsonObject.getString("requestBody");
try { URL urls = new URL(url); HttpURLConnection conn = (HttpURLConnection) urls.openConnection(); conn.setRequestMethod("POST");
conn.setDoOutput(true); conn.setRequestProperty("Content-Type", "application/json"); if(requestBody!=null && !"".equals(requestBody)) conn.getOutputStream().write(requestBody.getBytes("UTF-8"));
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; StringBuffer content = new StringBuffer(); while ((inputLine = in.readLine()) != null) { content.append(inputLine); } in.close(); conn.disconnect(); return content.toString(); } } catch (Exception e) { e.printStackTrace(); } return "{code:404;string:'未知错误'}"; }
@GetMapping("/test") public String test(){ return "test"; } }
|
先自己在本地跑一下,用Postman测试一下POST请求,测试无误后就可以部署了。
部署可以使用任何提供云函数的产品,我习惯使用阿里云(主要是里面的余额还没有花完)。
阿里云也提供了新计费模式,好像给老用户每个月送100G的流量额度。
测试功能:
我成功的在杭州地域下面创建服务和函数,现在我们来测试一下我写的默认接口。
本次我将测试三次,一个test(返回当前时间)一个GET(获取ip请求的网站)一个POST(百度首页)。
Test:
请求参数:tset
请求结果:
GET:
目标网站:http://www.ip111.cn/
请求参数:get?url=http://www.ip111.cn/
请求结果:
POST:
目标网站:https://www.baidu.com/
请求参数:
{
“url”: “https://www.baidu.com/“,
“requestBody”: “{‘name’:’alis’}”
}
请求地址:post
请求结果:
测试IP:
等两分钟,再次调用GET测试,看看ip地址有无变化。
之前的地址是101.37.82.227
现在的地址是47.96.252.229
ip地址的确发生了变化,看来不需要部署多个服务也可以切换ip了。
如果需要多个地区的ip就把应用部署到多个地域即可。
部署到香港地域,访问结果。
过一会,等函数关闭后再次唤醒函数(注意SpringBoot启动的开销资源)就又可以得到一个新的ip。
在香港地域可以通过先把压缩版上传到OSS,再通过OSS部署这样方便些。
避免了重复部署的问题,而且对于香港地域的OSS有5G的免费额度。
但是其他的地域貌似还是要上传代码,算了,等需要用的时候再去部署。
后记:
所以,编程的小伙伴可以自己去实现一下。
比起买代理要划算和安全一些,但是实名日站总感觉有点怪怪的。
这个的费用其实非常低的,什么的几次测试的资源消耗,如下图所示。