本文共 7368 字,大约阅读时间需要 24 分钟。
本章内容主要完成以下几个内容:
1、记录Dubbo接口请求
2、搜索请求记录 3、前端页面完成 4、项目第一阶段展示
项目展示中主要演示在本地如何启动项目,进行调试。如果需要部署线上环境,可以去搜索其他方案。
这里的数据模型可以根据你自己的需要来添加,比如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
这里我们添加连个序列化类,一个用来获取数据,一个用来请求
class ControllerInfoSerializer(ModelSerializer): """ 接口详情序列化类 """ class Meta: model = DubboControllerLogs fields = '__all__'class InvokeSerializer(ModelSerializer): class Meta: model = DubboControllerLogs fields = ("service_name", "dubbo_method", "params_type")
然后完成我们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))
接下来完成“查询请求记录”和“搜索功能”。搜索功能的话使用的是 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})
完成逻辑代码之后,我们就可以在urls.py中注册相关路由就可以请求了。
前端项目在一个开源项目基础上修改的,节省了很多时间,有需要可以移步
页面的开发采用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.logwhitePath.includes(config.url) || (config.headers = { 'Authorization':"JWT "+AUTH_TOKEN,'Content-Type': 'application/json'})return config}) // 添加实例方法 Vue.prototype.$http = axios}export default MyHttpServer
新增config/index.js,新增了修改了后台的请求地址
const hostUrl ={ DEV_HOST: 'http://127.0.0.1:8000/api/'} export default hostUrl;
git 拉去master代码 TestPlatform
在settings中修改你的mysql配置
pip install -r package.txt
生成数据库表
python manage.py makemigrationspython manage.py migrate
最后启动后台服务
python manage.py runserver
服务启动成功,接下来 启动前端项目
git 拉去master代码 TestPlatform-web
进入主目录npm installnpm run dev
注册用户,手机号,邮箱不能重复
{ "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" }}
服务中的方法是 :
Object getStudent(Integer id, List name),参数需要使用 [] 包起来{ "service_name": "com.zl.ITestService", "dubbo_method": "add", "params_type":"others", "params": [ 123, [ "zl" ] ]}
枚举类请求:
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 "} ]}
常见的异常情况:
1、请求参数异常
请求Dubbo接口如果填入的参数有误,会报 no such method 的错误,请检查一下参数是否正常 2、对于入参是Boolean类型的数据 在json中,直接 使用{“data”:true}即可,但是在python请求时需要使用 “true”,加上双引号
项目第一阶段基本完成,如果你们公司是使用Dubbo技术栈的,可以用这个平台来快速介入Dubbo接口的测试哦!
如果有疑问,或者对这个项目有更好的建议欢迎留言!我会持续改进
项目还存在诸多不足,因对Django不是很熟悉,很多Django的特性没有用上,比如管理后台,视图集。功能也只完成了一个大功能,如果你有更多的想法欢迎在git上提交代码。
如果你觉得项目对你有帮助,可以关注一下微信公众号,持续分享干货
转载地址:http://swve.baihongyu.com/