一个简易的SpringCloud Http Post 请求发送工具
时间:2020-03-23
本文章向大家介绍一个简易的SpringCloud Http Post 请求发送工具,主要包括一个简易的SpringCloud Http Post 请求发送工具使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
为了方便开发同学,用Python写了一个POST请求发送可执行脚本,方便那些不能使用postman等使用的局域网。当然可以使用CURL命令、用PHP写一个也未尝不可,但并不具备跨平台性。
当然也可以使用go进行开发,可本人还不太会。废话不多说,show me code。
原理:
获取到 Linux 系统配置的 apollo 配置中心地址:http://apolloUrl/
通过访问apollo配置中心 http://apolloUrl/configs/公共配置ID/default/公共配置namespace,获取到eureka的服务器地址。
然后访问 http://eurekaUrl/eureka/apps/ 获取到注册应用的真实ip地址。
解析XML配置,最后替换并访问正确的目标地址。
import json import os import re import sys import requests from xml.dom.minidom import parseString from sys import argv # 公共配置appId PUBLIC_APOLLO_CONFIG_APP_ID = "xxxx.public" # 公共配置namepsace PUBLIC_APOLLO_CONFIG_NAMESPACE = "PUBLIC" # 公共配置key EUREKA_URL_KEY = "eureka.service.url" JSON_HEADERS = { 'content-type': "application/json;charset=UTF-8", 'user-agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36" } def doPost(url, postData): # 提交post请求 response = requests.post(url, headers=JSON_HEADERS, data=postData) return response def doGet(url): # 提交post请求 response = requests.get(url, headers=JSON_HEADERS) return response.text def isIpAddressPort(ipStr): p = re.compile('^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)(\:\d+)$') if p.match(ipStr): return True else: return False def parseEurekaUrl(confgJsonStr): data = json.loads(confgJsonStr) eurekaUrlStr = data['configurations'][EUREKA_URL_KEY] eurekaUrls = eurekaUrlStr.split(',') return eurekaUrls[0] def getRealIpPort(configXml, appNamStr): # 读取文件 dom = parseString(configXml) # 获取文档元素对象 data = dom.documentElement # 获取 student applications = data.getElementsByTagName('application') for appInfo in applications: # 获取标签中内容 appName = appInfo.getElementsByTagName('name')[0].childNodes[0].nodeValue if appName != appNamStr: continue # 获取标签中内容 return appInfo.getElementsByTagName('instanceId')[0].childNodes[0].nodeValue def getRealHttpUrl(apolloUrl, httpUrl): httpUrlTmp = httpUrl.replace("http://", '') httpUrlTmp = httpUrlTmp.replace("https://", '') urls = httpUrlTmp.split("/") appName = urls[0].upper() if isIpAddressPort(appName): return httpUrl url = apolloUrl + "/configs/" + PUBLIC_APOLLO_CONFIG_APP_ID + "/default/" + PUBLIC_APOLLO_CONFIG_NAMESPACE eurekaUrl = parseEurekaUrl(doGet(url)) endStr = eurekaUrl[-1] if "/" == endStr: eurekaUrl = eurekaUrl[0:-1] eurekaUrl += "/apps" realIpPort = getRealIpPort(doGet(eurekaUrl), appName) return httpUrl.replace(appName, realIpPort) def callService(apolloUrl, httpUrl, postData): try: httpUrlOrigin = httpUrl httpUrl = getRealHttpUrl(apolloUrl=apolloUrl, httpUrl=httpUrl) print("\r\nRequestOriginUrl: {}".format(httpUrlOrigin)) print("RequestUrl: {}".format(httpUrl)) print("RequestMethod: POST") print("RequestData:") print("{}".format(json.dumps(json.loads(postData), indent=4))) response = json.loads(doPost(httpUrl, postData).text) print("ResponseDump:") print("{}\r\n".format(json.dumps(response, indent=4))) print("Response:") print("{}\r\n".format(json.dumps(response))) except Exception as e: print("error:{}".format(repr(e))) if __name__ == '__main__': apolloUrl = os.getenv('APOLLO_META') if 0 == len(apolloUrl): print("Please Set the APOLLO_META variable in the /etc/profile file !") sys.exit(1) if len(argv) < 3: print("Please input URL and PostData !") print( "Simple: ./springTest http://ABC/cde/fgh '{\"a\":\"b\"}' Or ./springTest http://ip[:port]/cde/fgh '{\"a\":\"b\"}'") sys.exit(1) callService(apolloUrl, argv[1], argv[2])
编译成可执行文件:
pip3 install pyinstaller
pyinstaller -F springTest.py
使用示例:
./springTest http://应用id/xxxCtl/xxxAction '{"a":"b"}'
./springTest http://ip[:port]/xxxCtl/xxxAction '{"a":"b"}'
PS:
编译时报依赖库不存在解决办法:http://www.pythonheidong.com/blog/article/158136/
原文地址:https://www.cnblogs.com/phpdragon/p/12551992.html
- c#处理空白字符
- 后台优化:使用应用性能管理工具
- Disruptor-NET和内存栅栏
- 我们是如何将 Cordova 应用嵌入到 React Native 中
- ADO.NET的弹性连接控制[ADO.NET idle connection resiliency]
- ASP.Net MVC 5 in Xamarin Studio 5.2
- 自制基于 Snips 和 Snowboy 的智能音箱来保护你的隐私
- 从 React 将从 BSD 改 MIT 许可证,谈如何选择正确的开源许可
- Topshelf 支持Mono 扩展Topshelf.Linux
- 如何在 React Native 实现类微信小程序平台:WebView 调用原生组件
- 如何运营一个开源项目并取得较大影响力?
- ASP.NET Identity 2新增双重认证、帐号锁定、防伪印章功能并修复了一些bug
- Serverless 应用开发指南:基于 Serverless 与 Lambda 的微信公共平台
- Serverless 应用开发指南:serverless 的 hello, world
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 七日Python之路--第三天(之初试Django 2-2)
- 超性感的React Hooks(十)useRef
- 七日Python之路--第三天(之初试Django 2-1)
- 超性感的React Hooks(十一)useCallback、useMemo
- 七日Python之路--第二天
- 八、通过断点调试观察JS执行过程
- 传智播客OA项目学习--阶段三(Struts中Action书写)
- 九、函数与函数式编程
- 关于Hibernate懒加载----Spring filter
- 十、详解函数柯里化
- Unable to load file:*struts.xml-[unknown location]
- 使用hooks重新定义antd pro想象力(一)
- 传智播客OA项目学习--阶段三(级联操作)
- 七日Python之路--第十一天
- 使用hooks重构antd pro的想象力(三)我是如何利用hooks干掉redux的