如何在类定义中调用REST API

0 投票
1 回答
2589 浏览
提问于 2025-04-18 00:20

我正在进行一些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比检查一个列表是否为空要更明了),但有时候也可能适得其反。

顺便提一下:要小心捕获这么宽泛的异常。比如,如果出现了内存溢出错误,你真的能接受继续运行吗?

撰写回答