原标题:让API自动生成文档

程序员最苦恼的事情莫过于写文档。由于业务口径频繁变更,因此很多接口也会频繁变更,频繁变更导致文档的维护是一件相当费时的事情,当优先级更高的事情袭来,更新文档反到成了次要工作,久而久之,文档就算有,也不是最新的,有些接口,干脆文档也不写了,口口相传了事。

没有文档,对于新手或者工作交接,是一件非常麻烦的事情,也不利于程序的传承。

那么,有没有这样一种程序,根据 api 函数的规范注释,及 api 的功能自动生成 api 的文档呢?这样一来,改接口,只要注释完善下,api 文档就自动生成,文档时刻保持最新,岂不省事。网上搜索了下,还真有大神实现了这样的框架。不得不感慨,没有程序员实现不了的好功能,只有程序员想不到的好方法。

实际上,一些流行的 web 框架已经原生集成了自动生成 api 文档的功能。比如我最近学习的 django rest framework 框架就可以自动生成 api 文档,有了这个功能,领导再也不用担心没有接口文档了。

下面对官方给和样例程序及自定义的 api 来自动生成文档,暂时不考虑 api 的权限及有选择的生成 api 文档的功能,这些在深入学习之后,都不是难事。这些样例的作用在于快速展示如何自动生成 api 文档的功能,想深入了解的还是看下框架的源代码。

先开发 api

请先仿照 django rest framework 官方的教程快速实现一个 api。

比如,我这里的 api 视图代码就是这样子的:

1、官方的 api

##官方api

from django.contrib.auth.models import User, Group

from rest_framework import viewsets

from mail.serializers import UserSerializer, GroupSerializer

class UserViewSet(viewsets.ModelViewSet):

"""

API endpoint that allows users to be viewed or edited.

"""

queryset = User.objects.all.order_by('-date_joined')

serializer_class = UserSerializer

class GroupViewSet(viewsets.ModelViewSet):

"""

API endpoint that allows groups to be viewed or edited.

"""

queryset = Group.objects.all

serializer_class = GroupSerializer

2、我自己写了一个发送邮件的 api ,代码如下:

# Create your views here.

from rest_framework.views import APIView

from django.core.mail import send_mail, BadHeaderError

from rest_framework.response import Response

from .get_parameter import get_parameter_dic

import logging

logger = logging.getLogger('django')

##自定义api

class SendMail(APIView):

"""

发送信息到指定人员邮箱

"""

def post(self, request, format=None):

"""

post:

发送信息到指定人员邮箱

参数列表:

from_email: 发件人邮箱

to_email: 收件人,多个收件人请使用英文逗号分隔隔开

subject: 邮件主题

message: 邮件正文

"""

# 获取请求方的 ip 地址

print(request.data)

ip = ""

if 'HTTP_X_FORWARDED_FOR' in request.META:

ip = request.META['HTTP_X_FORWARDED_FOR']

else:

ip = request.META['REMOTE_ADDR']

params = get_parameter_dic(request)

subject = params['subject']

message = params['message']

from_email = params.get('from_email', 'somenzz@163.com')

to_email = params['to_email']

return_data = {'code': 0, 'message': f'send email to {to_email} successful.'}

if subject and message and to_email:

try:

to_email = to_email.split(',') # 多个收件人以;分隔

print("to_email", to_email, type(to_email))

send_mail(subject, message, from_email, to_email)

except BadHeaderError:

return_data['code'] = 1

return_data['message'] = 'Invalid header found.'

else:

# In reality we'd use a form class

# to get proper validation errors.

return_data['code'] = 2

return_data['message'] = 'Make sure all fields are entered and valid.'

logger.info(

f"ip = {ip}, subject = {subject },message = {message }, from_email = {from_email }, to_email = {to_email }, return_data = {return_data }")

return Response(return_data)

这里使用了 post 方法,在 post 请求的 body 里可以传输 4 个参数,分别是 subject 、message、from_email、to_email。其中 from_email 有默认值,是 somenzz@163.com,因此这个参数也可以省略。

这里分享下 django 框架获取参数的通用函数。

django 框架获取参数有多种方式,如 get 请求中参数都会在 url 中传输,比如:http://xxx.com/api/?name=asdf&phone=13xxxx 这样。使用 request.query_params 中可以获取 name,phone 等参数,request.query_params 返回的数据类型为 QueryDict,QueryDict 转为普通 python 字典 query_params.dict即可。

在 post 请求参数一般放在请求的 body 中, 但是仍可以放在 url 仍中,类似 get 的形式, 最终结果, 参数会有两部分组成, 一部分在 url 中, 一部分在http body 中, 但是非常不建议这样做。接下来的代码编写也不会考虑这样的情况, post 仅考虑所有参数都在 http body 中的情况。这样,无论是 post ,还是 get ,我们可以编写统一的 参数获取函数,如下所示:

from django.http import QueryDict

from rest_framework.request import Request

def get_parameter_dic(request, *args, **kwargs):

if isinstance(request, Request) == False:

return {}

query_params = request.query_params

if isinstance(query_params, QueryDict):

query_params = query_params.dict

result_data = request.data

if isinstance(result_data, QueryDict):

result_data = result_data.dict

if query_params != {}:

return query_params

else:

return result_data

也是自定义 api 中:

from .get_parameter import get_parameter_dic

使用的函数。

3、修改 settings.py

在 INSTALLED_APPS 增加两项:

INSTALLED_APPS = [ 'mail.apps.MailConfig', #自定义的 app

'rest_framework', #导入 rest_framework

]

修改时区:

TIME_ZONE = 'Asia/Shanghai'

增加发邮件的信息:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

EMAIL_HOST = 'smtp.163.com'

EMAIL_PORT = 25

EMAIL_HOST_USER = 'somezz@163.com'

EMAIL_HOST_PASSWORD = '******' EMAIL_USE_LOCALTIME = Tru

方法一、使用原生样式自动生成 api 文档

修改项目总的 urls.py,加入文档 url 路由,如下所示:

与原本的 urls.py 相比,其实就多了两行代码,

from rest_framework.documentation import include_docs_urls

path('api-docs/', include_docs_urls(title="api接口文档")),

就是这两行代码,自动生成了 api 的文档。下面来看一下效果

api1.png

我们可以看到这个 api 接口文档已经相当丰富了,左侧是所有的 api 列表,点击可以定位到相应的说明,也可以与点击 Source Code 查看多种语言调用 api 的样例代码。也可以点击 interact 按钮与 api 进行交互来测试 api,如下图所示:

api2.png

api3.png

api33.png

也可以在侧查看返回信息,及原始字符串 raw。这些 api 有个共同点就是使用 django rest framework 封装好的类来实现的,屏蔽了很多细节,现在我们看一下自定义的发邮件 api,看看它的交互如何?

自定义的api

可以看到它获取到了 api 中的注释字符串。

自定义的api 未发现参数框

我们发现自定义的 api 没有对应的参数可以填写,这真让人郁闷。仔细啃官方的英文文档,终于在第二天实现了,方法如下:

修改自定义的 api 视图类,加入以下代码:

schema = AutoSchema(manual_fields= [

coreapi.Field(name="subject", required=True, location="query", deion="邮件主题"),

coreapi.Field(name="message", required=True, location="query", deion="邮件正文"),

coreapi.Field(name="from_email", required=False, location="query", deion="发件人"),

coreapi.Field(name="to_email", required=True, location="query", deion="收件人,多个使用逗号分隔"),

])

前提要导入以下包:

from rest_framework.schemas import AutoSchema

import coreapi

再次查看自定义的 api,发现有变化了:

自定义的api

我们发现,有了参数,但是描述信息不知道为什么没有获取到,如果有大神知道,请赐教。

下面交互,

自定义的api交互成功

终于大功告成,后面有人来问 api 的事情,不用理他,向他扔这样一个 api 文档就可以了。

注意,这里依赖 coreapi ,使用过程中使用 pip 安装下即可

pip install coreapi

方法二、使用第三方库自动生成 api 文档

这里介绍下 django-rest-swagger,使用方法如下:

1、先安装:

pip install django-rest-swagger

2、加入到 INSTALLED_APPS

INSTALLED_APPS = (

... '

rest_framework_swagger',

)

3、修改项目 urls.py,类似下面这样:

from django.conf.urls import url

from rest_framework_swagger.views import get_swagger_view

schema_view = get_swagger_view(title='API 接口文档')

urlpatterns = [

url(r'^docs$', schema_view)

]

本例中的效果如下所示:

rest_framework_swagger

rest_framework_swagger

交互

交互

功能和原生的大同小异,每个人喜欢的风格不一样,网上还有很多生成 api 文档的轮子,大家可以选一款自己喜欢的直接用就好。

來源:简书 somenzz返回搜狐,查看更多

责任编辑:

Matlab联合wps的API生成文档,让API自动生成文档相关推荐

  1. 自动变速器换档规律的研究 外文翻译

    外文翻译 the researchs of amt shifting schedules Vehicular Automatic Transmission can be divided into th ...

  2. word取消自动打开文档结构图

    不知何时起,我用的MS Word 2003每次打开时,都会自动打开文档结构图, 用Outlook写邮件的时候,也会打开这个文档结构图,很烦,上网查了一圈儿,也没有找到好用的方法..... 后来有一次, ...

  3. java接口废弃注释_Spring Boot如何让Web API自动生成文档,并解决swagger-annotations的API注解description属性废弃的问题...

    前后端分离的系统架构中,前端开发人员需要查看后端WEB API的文档来进行开发.采用后端API文档自动生成的方式,可以大幅提高开发效率.swagger是一个被广泛使用的文档自动生成工具,可以与多种编程 ...

  4. IDEA 版 API 接口神器来了,一键生成文档,嘎嘎香!

    先看效果,这个文档就是通过该 IDEA 插件自动生成的,你能相信吗? 文档链接:https://petstore.apifox.cn 每个开发都不想写文档.当你不想写接口文档时,可以通过安装插件在 I ...

  5. Objective-C自动生成文档工具:appledoc

    作者 iOS_小松哥 关注 2016.12.13 15:47* 字数 919 阅读 727评论 10喜欢 35 由于最近琐事比较多,所以好久没有写文章了.今天我们聊一聊Objective-C自动生成文 ...

  6. Objective-C 自动生成文档工具:appledoc

    来源:iOS_小松哥 www.jianshu.com/p/fd4d8d6b6177 如有好文章投稿,请点击 → 这里了解详情 由于最近琐事比较多,所以好久没有写文章了.今天我们聊一聊Objective ...

  7. linux c/c++ 代码使用 doxygen 自动生成文档

    www.doxygen.org 的使用非常方便,下面分成2步介绍一下 1. 注释风格,需要在c/c++代码中按照下面的风格添加注释,基本上还是很顺手的 C++的注释风格 主要使用下面这种样式:即在注释 ...

  8. java动态生成sdk_android、java制作sdk以及自动生成文档

    最近一直在做android开发,昨天经理让我写个接口SDK做个接口文档,以便后面的开发. 这让我很焦灼,SDK怎么做?要是只有敲代码还好.可是那个接口文档!!!文档这东西最讨厌了,头都大了 后来查了下 ...

  9. java如何写安卓接口文档_android、java制作sdk以及自动生成文档

    最近一直在做android开发,昨天经理让我写个接口SDK做个接口文档,以便后面的开发. 这让我很焦灼,SDK怎么做?要是只有敲代码还好.可是那个接口文档!!!文档这东西最讨厌了,头都大了 后来查了下 ...

最新文章

  1. adb 连接某个wifi_一加7 Pro全局强制开启90Hz刷新率的办法(附ADB文件下载)
  2. VTK:图片之RGBToYIQ
  3. 删除字符,用外部函数
  4. 关于项目中一些时间转换的问你题 -紫叶and妍
  5. php跨域请求解决方案_解决TP接口跨域问题
  6. 添加和更改webstorm主题
  7. The GenerateResource task failed unexpectedly. a generic error occured in GDI+
  8. 商业领域中的IT技术应用之二-POS收款机及收款系统介绍
  9. 微信小程序 # 仿写微信通讯录页面(字母侧栏效果)
  10. OpenCV2.4.13+CUDA8.0+SSBA3.0+VS2010编译安装
  11. 数学基础知识总结 —— 12. 求极限的重要工具「洛必达法则」
  12. 苹果几最好用_苹果quot;官方保险quot;再升级,屏幕两年可以碎4次,值么?
  13. 部分女生爱搭配蕾丝的服饰
  14. 网站PV、UV的含义
  15. MySql版本号查看命令
  16. BZOJ4379: [POI2015]Modernizacja autostrady
  17. ARCore之路-连接设备调试应用
  18. 大学四年因为知道了这32个网站,我成了别人眼中的大神!
  19. 一维数组的创建及使用
  20. Vitalik万字长文:困扰加密货币的硬核难题五年后都怎么样了?

热门文章

  1. python set函数排序_python的set函数 Python中的set会自动排序
  2. python字符串切片及常用方法
  3. ubuntu16.04网络监控工具iptraf
  4. java Random随机数-猜数字游戏
  5. 游戏产品在移动平台和pc平台研发选择问题
  6. mysql8.0JDBC驱动下载以及JDBC连接时遇到的问题
  7. JavaScript【十一】2022.5.23第十三周
  8. ASP.NET用户个性化设置Profile——配置2
  9. java读取文件中的字符串_java中怎样将文件的内容读取成字符串
  10. 苹果7设置不显示网络连接服务器,苹果ios7.1验证失败因为您不再连接到互联网解决方法...