代码之家  ›  专栏  ›  技术社区  ›  bombcar

如何让Swagger生成的Python客户端工作?

  •  2
  • bombcar  · 技术社区  · 6 年前

    我已经从中生成了python客户端和服务器 https://editor.swagger.io/ -服务器运行正常,无需编辑,但我似乎无法让客户端与它通信,或者与任何东西通信。

    我怀疑我在做一些非常愚蠢的事情,但我在互联网上找到的例子要么不起作用,要么似乎期望我了解如何制作对象。这是我的代码(我也尝试过不发送任何内容、字符串等):

    import time
    import swagger_client
    import json
    from swagger_client.rest import ApiException
    from pprint import pprint
    
    # Configure OAuth2 access token for authorization: petstore_auth
    swagger_client.configuration.access_token = 'special-key'
    # create an instance of the API class
    api_instance = swagger_client.PetApi()
    d = '{"id": 0,"category": {"id": 0,"name": "string"},"name": "doggie","photoUrls": ["string"],  "tags": [ {      "id": 0,      "name": "string"    }  ],  "status": "available"}'
    python_d = json.loads(d)
    print( json.dumps(python_d, sort_keys=True, indent=4) )
    body = swagger_client.Pet(python_d) # Pet | Pet object that needs to be added to the store
    
    try:
        # Add a new pet to the store
        api_instance.add_pet(body)
    except ApiException as e:
        print("Exception when calling PetApi->add_pet: %s\n" % e)
    

    我正在使用python 3.6.4,当运行上述命令时,我得到:

    Traceback (most recent call last):
      File "petstore.py", line 14, in <module>
        body = swagger_client.Pet(python_d) # Pet | Pet object that needs to be added to the store
      File "/Users/bombcar/mef/petstore/python-client/swagger_client/models/pet.py", line 69, in __init__
        self.name = name
      File "/Users/bombcar/mef/petstore/python-client/swagger_client/models/pet.py", line 137, in name
        raise ValueError("Invalid value for `name`, must not be `None`")  # noqa: E501
    ValueError: Invalid value for `name`, must not be `None`
    

    我觉得我犯了一个难以置信的基本错误,但我实际上是从 https://editor.swagger.io/ -但由于我找不到一个实际可行的例子,我不知道我遗漏了什么。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Helen    6 年前

    Python客户端生成器为API生成面向对象的包装器。您不能直接发布dict或JSON字符串,您需要创建 Pet 使用生成的包装器的对象:

    api_instance = swagger_client.PetApi()
    pet = swagger_client.Pet(name="doggie", status="available",
                             photo_urls=["http://img.example.com/doggie.png"],
                             category=swagger_client.Category(id=42))
    
    response = api_instance.add_pet(pet)
    
        2
  •  1
  •   DianaDu    3 年前

    我最近也遇到了类似的问题,最终通过在本地升级python版本得到了修复。我从中生成了python flask服务器zip文件 https://editor.swagger.io/ 。然后,我使用py 3.6.10在本地设置环境。在使用“Model\u Name.from\u dict()”解析输入时,我遇到了相同的错误,告诉我

    raise ValueError("Invalid value for `name`, must not be `None`")  # noqa: E501 
    ValueError: Invalid value for `name`, must not be `None`
    

    然后我升级到python 3.7。x、 问题已解决。我知道您的问题与版本无关,但是,万一有人遇到类似问题并寻求帮助,可以看到此答案。