如何在类定义中调用REST API
我正在进行一些RESTful API的调用,主要是和外部部门进行数据交互。我写了几个函数(像下面的代码片段那样),根据我需要的信息来处理这些调用,比如“注册”、“个人信息”等等。现在我在想,把这些功能放到一个类里面是不是更符合Python的风格,这样处理一些像“是否有及格成绩”这样的功能会更方便,而且在创建这个类的时候可以把这些信息作为属性传出来。
这样做有没有什么标准的方法?是不是只需要创建一个类,然后像我下面的代码那样构建API的地址,调用API,解析和格式化数据,最后构建一个字典或者其他东西返回,就可以完成了?调用这个类的代码会是什么样子的呢?有没有人能分享一些类似的示例代码?
提前谢谢大家的帮助!
from django.utils import simplejson
try:
api_url = get_api_url(request, 'enrollment', person_id)
enrollment = call_rest_stop(key, secret, 'GET', api_url)
enrollment_raw = enrollment.read()
if enrollment_raw == '' or None:
return 'error encountered', ''
enrollment_recs = simplejson.loads(enrollment_raw)
# now put it in a dict
for enrollment in enrollment_recs:
coursework_dict = {
'enrollment_id': enrollment['id'],
...,
}
coursework_list.append(coursework_dict)
cola_enrollment.close()
except Exception, exception:
return 'Error: ' + str(exception), ''
1 个回答
1
假设你希望使用你这个API的人能够这样调用你的API:
student_history, error_message = get_student_history(student_id)
然后你可以把上面的内容放进一个函数里:
from django.utils import simplejson
def get_student_history(person_id)
try:
api_url = get_api_url(request, 'enrollment', person_id)
enrollment = call_rest_stop(key, secret, 'GET', api_url)
enrollment_raw = enrollment.read()
if enrollment_raw == '' or None:
return [], 'Got empty enrollment response'
enrollment_recs = simplejson.loads(enrollment_raw)
# now put it in a dict
for enrollment in enrollment_recs:
coursework_dict = {
'enrollment_id': enrollment['id'],
...,
}
coursework_list.append(coursework_dict)
cola_enrollment.close()
return coursework_list, None
except Exception as e:
return [], str(exception)
你也可以使用一个类,但要记住,只有当你的API使用者能从中受益时,才应该这样做。例如:
class EnrollmentFetcher(object):
def __init__(person_id):
self.person_id = person_id
def fetch_data(self):
self.coursework_list, self.error_message = get_student_history(self.person_id)
def has_coursework(self):
return len(self.coursework_list) > 0
fetcher = EnrollmentFetcher(student_id)
fetcher.fetch_data()
if fetcher.has_coursework():
# Do something
面向对象编程本身没有好坏之分。你应该根据具体情况来决定是否使用它。在这个例子中,它可能会让你的代码更清晰(比如,has_coursework比检查一个列表是否为空要更明了),但有时候也可能适得其反。
顺便提一下:要小心捕获这么宽泛的异常。比如,如果出现了内存溢出错误,你真的能接受继续运行吗?