[Answer]-How to call a REST API from inside a Class definition

1👍

So, let’s say you want your API’s users to call your API like so:

student_history, error_message = get_student_history(student_id)

You could then just wrap the above in that function:

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)

You could also use a class, but keep in mind that you should only do that if there would be methods that those using your API would benefit from having. For example:

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

Object-oriented programming is neither a good practice nor a bad one. You should choose to use it if it serves your needs in any particular case. In this case, it could help clarify your code (has_coursework is a bit clearer than checking if a list is empty, for example), but it may very well do the opposite.

Side note: Be careful about catching such a broad exception. Are you really okay with continuing if it’s an OutOfMemory error, for example?

👤DavidM

Leave a comment