BKAPIResource
APIResource将一个API接口封装为Resource,便于调用
class APIResource(ApiResourceProtocol, CacheResource, metaclass=abc.ABCMeta)
主要方法和属性:
module
:模块名,主要用于调试
TIMEOUT
请求超时时间
url_keys
用于path参数的映射
def request(self, request_data=None, **kwargs):
调用父类Resource
请求流程(校验请求参数-处理逻辑-验证返回数据)
def perform_request(self, validated_request_data):
发起http请求,可以识别非GET请求中的文件数据。
-
def build_request_data(self, validated_request_data):
请求前对请求参数做处理
-
def build_url(self, validated_request_data):
拼接最终URL
-
def build_header(self, validated_request_data):
在请求前构造请求头
-
def before_request(self, kwargs):
对于非GET请求,如果不存在文件数据则按照JSON方式请求,否则分开传参,可以由此方啊做最后的处理。
-
def parse_response(self, response: requests.Response):
在提供数据给
response_serializer
之前,对数据作最后的处理。尝试解析json数据,返回数据的data
部分。
class BkApiResource(APIResource, abc.ABC):
基于APiResource
在请求时携带鉴权信息,并对返回数据做鉴权认证。
method = "GET"
:请求方法默认为GETbkapi_header_authorization
:api头部鉴权platform_authorization
:平台鉴权
样例:
定义API
# api/bk_community/default.py
import abc
from bk_resource import BkApiResource
from django.utils.translation import gettext_lazy
class CommunityResource(BkApiResource, abc.ABC):
base_url = "https://bk.tencent.com/s-mart/forum"
module_name = "bk_community"
class TopicsResource(CommunityResource):
name = gettext_lazy("查询论坛主题")
method = "GET"
action = "/topics/"
调用API:
from bk_resource import api
api.bk_community.topics(keyword="test", page=1, page_size=1)
实际请求url
为https://bk.tencent.com/s-mart/forum/topics/?page=1&page_size=10&keyword=test
path参数
如果接口中存在path参数则可以按照以下方式进行编写
class TopicsResource(CommunityResource):
name = gettext_lazy("查询模块")
method = "GET"
action = "/forum/topics/{topic_id}"
url_keys = ["topic_id"]
调用API:
from bk_resource import api
api.bk_community.topics(keyword="test", topic_id=2002)
实际请求url为https://bk.tencent.com/s-mart/forum/topics/1002/?keyword=test
其他
因为BkApiResource
继承于Resource
,因此可以使用Resource
相关功能,如可以重写RequestSerializer
和ResponseSerializer
属性对请求参数和返回数据进行校验和处理。