网站首页 > 技术文章 正文
前言
本章内容主要完成以下几个内容:
1、记录Dubbo接口请求
2、搜索请求记录
3、前端页面完成
4、项目第一阶段展示
项目展示中主要演示在本地如何启动项目,进行调试。如果需要部署线上环境,可以去搜索其他方案。
1、记录Dubbo接口请求
这里的数据模型可以根据你自己的需要来添加,比如Dubbo接口可以按照“微服务”,“部门”来划分,因为我这个项目主要是提供思路,所以没有划分的很详细,这里直接由 user_id来记录。
class DubboControllerLogs(Model):
service_name = models.CharField(max_length=128, unique=False, null=False, blank=False, verbose_name="服务名")
dubbo_method = models.CharField(max_length=64, unique=False, null=False, blank=False, verbose_name="方法名")
params_type = models.CharField(max_length=16, null=True, blank=True, verbose_name="参数类型")
params = models.CharField(max_length=2048,default="", verbose_name="参数")
user_id = models.IntegerField(verbose_name="请求人的ID")
create_time = models.DateTimeField(auto_now_add=True, verbose_name="添加时间") # auto_now_add 设置为True,添加时间不可变
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间") # auto_now 设置为True,更新时间可变
class Meta:
db_table = "dubbo_controller_logs"
verbose_name = "Dubbo接口请求记录"
verbose_name_plural = verbose_name
def __str__(self):
return self.service_name + "#" + self.dubbo_method
1234567891011121314151617
这里我们添加两个序列化类,一个用来获取数据,一个用来请求
class ControllerInfoSerializer(ModelSerializer):
"""
接口详情序列化类
"""
class Meta:
model = DubboControllerLogs
fields = '__all__'
class InvokeSerializer(ModelSerializer):
class Meta:
model = DubboControllerLogs
fields = ("service_name", "dubbo_method", "params_type")
1234567891011121314
然后完成我们view.py视图函数,我们在第二章的请求Dubbo接口上进行一些改造,在每次请求的时候保存请求记录
class DubboApi(CreateAPIView):
permission_classes = (IsAuthenticated,) # 登陆才能请求
authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
serializer_class = InvokeSerializer
def post(self, request, *args):
"""
请求Dubbo接口
:param request:
:return:
"""
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
serializer.save(user_id=request.user.id, params=json.dumps(request.data.get('params')))
else:
return params_error(message=serializer.errors)
service_name = request.data.get('service_name')
dubbo_method = request.data.get('dubbo_method')
# 多参数类型,多参数
params_type = request.data.get('params_type')
params = request.data.get('params')
dubbo_info = GetDubboService().get_dubbo_info(service_name)
server_host = dubbo_info.get("server_host")
server_port = dubbo_info.get("server_port")
# 判断参数类型
if params_type == "class":
result = InvokeDubboApi(server_host, server_port).invoke_dubbo_api(service_name, dubbo_method, params)
else:
args = params
result = InvokeDubboApi(server_host, server_port).invoke_dubbo_api(service_name, dubbo_method, *args)
return ok_data(data=json.loads(result))
12345678910111213141516171819202122232425262728293031
搜索请求记录
接下来完成“查询请求记录”和“搜索功能”。搜索功能的话使用的是 objects.filter() ,没有用SearchFilter过滤器,感兴趣的可以了解一下。
class DubboInfosView(ListAPIView):
serializer_class = ControllerInfoSerializer
# 分页
pagination_class = DubboPagination
permission_classes = (IsAuthenticated,)
authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
def get(self, request, *args, **kwargs):
service_name = request.GET.get("service_name")
dubbo_method = request.GET.get("dubbo_method")
if service_name =="" and dubbo_method =="":
search_dubbo = DubboControllerLogs.objects.all()
total = search_dubbo.count()
elif service_name != "" and dubbo_method != "":
search_dubbo = DubboControllerLogs.objects.filter(Q(service_name__icontains=service_name) &
Q(dubbo_method__icontains=dubbo_method))
total = search_dubbo.count()
elif dubbo_method != "":
search_dubbo = DubboControllerLogs.objects.filter(Q(dubbo_method__icontains=dubbo_method))
total = search_dubbo.count()
else:
search_dubbo = DubboControllerLogs.objects.filter(Q(service_name__icontains=service_name))
total = search_dubbo.count()
dubbo_infos_str = serializers.serialize('json', search_dubbo.order_by('-id'),
fields=(
"service_name", "dubbo_method", "params_type", "params", "user_id"))
dubbo_infos = json.loads(dubbo_infos_str)
# 实例化分页对象,获取数据库中的分页数据
paginator = DubboPagination()
page_info_list = paginator.paginate_queryset(dubbo_infos, self.request, view=self)
json_list = []
for dubbo in page_info_list:
dubbo_info = dubbo.get("fields")
json_list.append(dubbo_info)
return ok_data(data={"total": total, "dubbo_infos": json_list})
1234567891011121314151617181920212223242526272829303132333435
完成逻辑代码之后,我们就可以在urls.py中注册相关路由就可以请求了。
3、前端页面完成
前端项目在一个开源项目基础上修改的,节省了很多时间,有需要可以移步
http://panjiachen.github.io/vue-admin-template
页面的开发采用elementui现成的页面组件
在原项目的utils文件夹下新增http.js 封装了适合本项目的一个请求方式
import axios from 'axios'
import hostUrl from '@/config'
import { getToken } from "@/utils/auth";
const MyHttpServer = {}
const whitePath = ['user/login', 'user/register']
MyHttpServer.install = (Vue) => {
axios.interceptors.request.use((config) => {
config.baseURL = hostUrl.DEV_HOST
// // 设置请求头
const AUTH_TOKEN = getToken('vue_admin_template_token')
console.log
whitePath.includes(config.url) || (config.headers = {'Authorization':"JWT "+AUTH_TOKEN,
'Content-Type': 'application/json'
})
return config
})
// 添加实例方法
Vue.prototype.$http = axios
}
export default MyHttpServer
1234567891011121314151617181920212223
新增config/index.js,新增了修改了后台的请求地址
const hostUrl ={
DEV_HOST: 'http://127.0.0.1:8000/api/'
}
export default hostUrl;
123456
4、项目第一阶段展示
4.1启动后台项目
git 拉去master代码 TestPlatform https://github.com/627886474/TestPlatform
在settings中修改你的mysql配置
在config.ini中填上你zookeeper的地址
然后下载相关依赖包
pip install -r package.txt
1
生成数据库表
python manage.py makemigrations
python manage.py migrate
12
最后启动后台服务
python manage.py runserver
1
服务启动成功,接下来 启动前端项目
4.2 启动前端项目
git 拉去master代码 TestPlatform-webhttps://github.com/627886474/TestPlatform-web
进入主目录
npm install
npm run dev
12
4.3 界面演示
注册用户,手机号,邮箱不能重复
注册成功后,登录账号,进入后台管理页面
进入Dubbo接口 服务调用菜单,填入相关参数,对于不同Dubbo接口的入参说明请看最后
在调用记录弹出框中,可搜索之前Dubbo服务的调用记录,并且一键填充,可快速复制别人的请求记录,以方便自己使用
入参说明
请求示例:
服务中的方法是 :
Object addStudent(UserAO user)
{
"service_name":"com.zl.ITestService",
"dubbo_method":"add",
"params_type":"class",
"params":{
"class":"com.zl.entity.ao.UserAO",
"school":[
"1",
"2"
],
"name":"zl",
"tuofa":"true"
}
}
1234567891011121314
服务中的方法是 :
Object getStudent(Integer id, List name),参数需要使用 [] 包起来
{
"service_name": "com.zl.ITestService",
"dubbo_method": "add",
"params_type":"others",
"params": [
123,
[
"zl"
]
]
}
1234567891011
枚举类请求:
Object getStudent(Integer itemId, StudentEnum studentEnum);
枚举类的类名: com.zl.item.entity.StudentEnum
需要使用到的枚举类:GOOD_STUDENT,填写格式如下 :
{
"service_name": "com.zl.ITestService",
"dubbo_method": "add",
"params_type":"others",
"params": [
123,{"name": "GOOD_STUDENT", "class": "com.zl.item.entity.StudentEnum "}
]
}
12345678
常见的异常情况:
1、请求参数异常
请求Dubbo接口如果填入的参数有误,会报 no such method 的错误,请检查一下参数是否正常
2、对于入参是Boolean类型的数据
在json中,直接 使用{“data”:true}即可,但是在python请求时需要使用 “true”,加上双引号
项目总结
项目第一阶段基本完成,如果你们公司是使用Dubbo技术栈的,可以用这个平台来快速介入Dubbo接口的测试哦!
如果有疑问,或者对这个项目有更好的建议欢迎留言!我会持续改进
项目还存在诸多不足,因对Django不是很熟悉,很多Django的特性没有用上,比如管理后台,视图集。功能也只完成了一个大功能,如果你有更多的想法欢迎在git上提交代码。
猜你喜欢
- 2024-10-12 php 给app 或前端封装api 接口——json格式
- 2024-10-12 前端基础:vue中Axios的封装和API接口的管理
- 2024-10-12 Vue项目中实现用户登录及token验证
- 2024-10-12 前端开发:TypeScript 接口与泛型 接口使用泛型
- 2024-10-12 Java实战系列-前端VUE代码开发及接口流程设计(1)
- 2024-10-12 你还不了解typescript中接口和类型别名的用法区别?本文帮你总结
- 2024-10-12 前端开发:JavaScript API应用程序编程接口
- 2024-10-12 Java 中间的接口还可以这样用,你知道吗?
- 2024-10-12 Web前端接口画中画(Picture-in-Picture)介绍
- 2024-10-12 vue 项目接口管理 vue3接口
你 发表评论:
欢迎- 05-10如何优化数据库和前端之间的交互?
- 05-10前端代码优化小秘籍(前端优化24条建议)
- 05-10VS Code当中的15个神仙插件,值得收藏
- 05-10如何自己开发一个Google浏览器插件?
- 05-10前端流行框架Vue3教程:14. 组件传递Props效验
- 05-10吃了一年的SU,最好用的插件都在这了
- 05-10前端必看!这款神器让网站界面告别千篇一律
- 05-10程序员请收好:10个非常有用的 Visual Studio Code 插件
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端md5加密 (49)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- 前端懒加载 (45)
- 前端接口 (46)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle查询数据库 (45)
- oracle约束 (46)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- mac oracle (47)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)