【问题标题】:Creating a python wrapper for an API using classes使用类为 API 创建 python 包装器
【发布时间】:2015-07-19 18:51:09
【问题描述】:

我正在尝试为 API 制作 Python Wrapper。我已经能够创建运行良好但不使用类的脚本。我想使用类对该 API 进行真正的包装。我是 Python 中的 OOP 新手。

以下是我的尝试,但我不知道如何将其转换为 OO 类型。

import urllib2
from urllib import urlencode
import json

class apiclient:
    def __init__(self,
                request_url,
                hmh_api_key,
                client_id,
                grant_type="password",
                username="username",
                password="password"):

        values = {
                "client_id": client_id,
                "grant_type": grant_type,
                "username": username,
                "password": password
            }

        data = urlencode(values)

        req = urllib2.Request(request_url, data)
        req.add_header("Api-Key", api_key)
        response = urllib2.urlopen(req)

        response_header = response.info().dict
        response_body = response.read()
        json_acceptable_string = response_body.replace("'", "\"")
        response_body_dict = json.loads(json_acceptable_string)

        return response_body_dict ## this is the response

if __name__ == "__main__":

    API_KEY = "75b5cc58a5cdc0a583f91301cefedf0c"
    CLIENT_ID = "ef5f7a03-58e8-48d7-a38a-abbd2696bdb6.hmhco.com"
    REQUEST_URL = "http://some.url"

    client = apiclient(request_url=REQUEST_URL,
                        api_key=API_KEY,
                        client_id=CLIENT_ID)

    print client

没有类,我得到的响应 JSON 为 response_body_dict,但有了类,我得到 TypeError: __init__() should return None。我应该如何开始设计我的程序。 我只展示了整个程序的一部分,还有很多类似的脚本可以向 URL 发送请求并获取 JSON 响应。

谢谢!

【问题讨论】:

    标签: python json api wrapper


    【解决方案1】:

    你不应该从__init__函数返回一些东西。

    编辑:

    如果您需要该值,您应该使用 response_body_dict 作为类成员并从其他方法获取他:

    import urllib2
    from urllib import urlencode
    import json
    
    class apiclient:
        def __init__(self,
                    request_url,
                    api_key,
                    client_id,
                    grant_type="password",
                    username="username",
                    password="password"):
    
            values = {
                    "client_id": client_id,
                    "grant_type": grant_type,
                    "username": username,
                    "password": password
                }
    
            data = urlencode(values)
    
            req = urllib2.Request(request_url, data)
            req.add_header("Api-Key", api_key)
            response = urllib2.urlopen(req)
    
            response_header = response.info().dict
            response_body = response.read()
            json_acceptable_string = response_body.replace("'", "\"")
            self.response_body_dict = json.loads(json_acceptable_string)
    
        def get_response_body(self):
            return self.response_body_dict
    
    if __name__ == "__main__":
    
        API_KEY = "75b5cc58a5cdc0a583f91301cefedf0c"
        CLIENT_ID = "ef5f7a03-58e8-48d7-a38a-abbd2696bdb6.hmhco.com"
        REQUEST_URL = "http://some.url"
    
        client = apiclient(request_url=REQUEST_URL,
                            api_key=API_KEY,
                            client_id=CLIENT_ID)
        response = client.get_response_body()
    
        print client
    

    【讨论】:

    • 那么我应该如何重写它,以便我能够输入我指定的任何键并获取响应 JSON,因为它包含另一个必须在其他 API 中使用的键?
    • @AnimeshPandey ,我编辑了我的答案,以便为您提供所需的解决方案。
    • 同时我尝试了另一件事,我实际上在__init__ 中将每个键指定为self.client_id 等。并在一个单独的函数中完成所有其他工作。我猜这和你做的一样??
    • 我发现你的方法更好。谢谢!
    • @AnimeshPandey ,如果您需要在其他方法中使用它们而不是它们应该是类成员。如果您仅在本地使用它们,那么它们不应该是类成员。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多