Django测试工具平台(四)---Dubbo接口请求记录 + 前端

前言

本章内容主要完成以下几个内容:

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

这里我们添加连个序列化类,一个用来获取数据,一个用来请求

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中注册相关路由就可以请求了。
在这里插入图片描述

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

新增config/index.js,新增了修改了后台的请求地址


const hostUrl ={
    DEV_HOST: 'http://127.0.0.1:8000/api/'
} 

export default hostUrl;

4、项目第一阶段展示

4.1启动后台项目

git 拉去master代码 TestPlatform https://github.com/627886474/TestPlatform

在settings中修改你的mysql配置

在这里插入图片描述
在config.ini中填上你zookeeper的地址
在这里插入图片描述
然后下载相关依赖包

pip install -r package.txt

生成数据库表

python manage.py makemigrations
python manage.py migrate

最后启动后台服务

python manage.py runserver

服务启动成功,接下来 启动前端项目
在这里插入图片描述

4.2 启动前端项目

git 拉去master代码 TestPlatform-webhttps://github.com/627886474/TestPlatform-web
进入主目录

npm install
npm run dev
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"
    }
}

服务中的方法是 :
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上提交代码。

如果你觉得项目对你有帮助,可以关注一下微信公众号,持续分享干货
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值