博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django测试工具平台(四)---Dubbo接口请求记录 + 前端
阅读量:356 次
发布时间:2019-03-04

本文共 7368 字,大约阅读时间需要 24 分钟。

前言

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

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、前端页面完成

前端项目在一个开源项目基础上修改的,节省了很多时间,有需要可以移步

页面的开发采用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;

4、项目第一阶段展示

4.1启动后台项目

git 拉去master代码 TestPlatform

在settings中修改你的mysql配置

在这里插入图片描述

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

pip install -r package.txt

生成数据库表

python manage.py makemigrationspython manage.py migrate

最后启动后台服务

python manage.py runserver

服务启动成功,接下来 启动前端项目

在这里插入图片描述

4.2 启动前端项目

git 拉去master代码 TestPlatform-web

进入主目录

npm installnpm 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上提交代码。

如果你觉得项目对你有帮助,可以关注一下微信公众号,持续分享干货

在这里插入图片描述

转载地址:http://swve.baihongyu.com/

你可能感兴趣的文章