[英]Django Rest Framework: Calling Internal API from External API
我必须在给定的Django Rest Framework中从外部API调用内部API。 当用户单击前端(位于Angular中)的某个按钮( 'View Calendar'
)时,将调用DRF的API终结点( '/viewCalendar/'
)。 这是外部API端点。 在/viewCalendar/
的终结点的views.py
中,我需要以这样一种方式编写代码,使其将调用另一个API(例如, '/commandExecForCalendar/'
),该API实际上将执行该方法并返回输出。 此输出将进一步通过外部API响应到前端。 外部和内部API都位于同一DRF项目中。
myDRFProj/
commandExecApp/
views.py -------- > this CBV works for internal calls
.
.
externalAPIApp/
views.py -------- > this CBV handles API call from front-end and it will call the API for internal calls
mydrfproj/
settings.py
urls.py ---------- > holds both external and internal API endpoints
urls.py
url(r'commandExecForCalendar', commandExecAppView.cmdExcFrCalendar.as_view()),
url(r'viewCalendar', externalAPIAppView.extApiCall.as_view()),
那么,如何编写这两个视图,使外部视图将请求数据发送到内部,并从中获取结果到前端的Response?
根据您API的复杂性,您可以设计externalAPIApp
视图,从而将CommandExecApp
CBV子类化。
我过去曾尝试过这种方法,但由于功能签名和基于DRF类的视图的返回类型,因此遇到了障碍。 通过应用程序中的继承(相对于组合)扩展功能时,这种情况并不罕见。
也就是说,有几种方法可以解决此问题:
API网关
将externalAPIApp
设计为充当网关Web服务,该服务本质上是通过HTTP将HTTP请求传递到commandExecApp
API。
您可以查看externalAPIApp
将对commandExecApp
发出的“客户端”请求的请求库。
共享域模块
考虑应用程序的三个主要组件:
权衡
两者都有优点和缺点。
网关方法引入了一些与其他(本地)网络请求相关的延迟。 另一方面,DRF为开发人员提供了节省时间的功能/组件,使其可以与域逻辑紧密耦合。
共享域模块提供了更大的关注点分离,但可能涉及预先编写和测试更多代码。
最终,要了解您的开发进度,技术路线图,相关人员等,这是一个架构决定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.