适用于 shopware 6 的 Python swagger-client

F.B*_*ann 5 python-3.x swagger shopware openapi swagger-codegen

再会,

我已经通过我的 GitLab ci pipline 中的 swagger-codegen-cli (v3) docker 映像为 Shopware 6 商店生成了一个 python 客户端。

我遇到的问题是每个端点都返回空数据,但奇怪的是,当我调试客户端时,我可以通过检查器看到数据,但是在返回数据之前的一个步骤中,它尝试反序列化数据并返回里面没有任何数据的字典。

return_data = response_data
if _preload_content:
    # deserialize response data
    if response_type:
        return_data = self.deserialize(response_data, response_type)
Run Code Online (Sandbox Code Playgroud)

这是从__call_api()函数。当我检查 response_data 时,我可以看到它包含我需要的数据,但 deserialize() 返回: {'data': None, 'included': None, 'links': None, 'meta': None}

我知道我可以将参数 _preload_content 设置为 false,但随后我将原始请求响应作为字节字符串获取,这违背了使用 swagger 客户端的目的。

  • 是不是我店的规格有问题?
  • 代码生成器工作不正常吗?
  • 或者是来自swagger的python生成器的问题?

编辑:

我将问题缩小到__init__()所有继承自 Success 类的 Response 类的功能:

    def __init__(self, data=None, links=None, *args, **kwargs):  # noqa: E501
        """InlineResponse200156 - a model defined in Swagger"""  # noqa: E501
        self._data = None
        self._links = None
        self.discriminator = None
        if data is not None:
            self.data = data
        if links is not None:
            self.links = links
        Success.__init__(self, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

在最后一步,它调用__init()成功的功能:

    def __init__(self, meta=None, links=None, data=None, included=None):  # noqa: E501
        """Success - a model defined in Swagger"""  # noqa: E501
        self._meta = None
        self._links = None
        self._data = None
        self._included = None
        self.discriminator = None
        if meta is not None:
            self.meta = meta
        if links is not None:
            self.links = links
        self.data = data
        if included is not None:
            self.included = included
Run Code Online (Sandbox Code Playgroud)

由于数据未传递给 Success 的构造函数,因此 self.data 被 None 覆盖。

似乎swagger的pyhton生成器生成这些构造函数是错误的。当我删除 InlineResponse200156 中被覆盖的构造函数时,它似乎有效,但由于此问题存在于所有继承成功的生成类中,我认为问题出在生成器本身中。