【问题标题】:What's the right way to handle chunked json response with swagger and autogenerated php client?使用 swagger 和自动生成的 php 客户端处理分块 json 响应的正确方法是什么?
【发布时间】:2020-08-07 18:16:48
【问题描述】:

我有点迷失在定义、生成的代码和许多有点像黑盒子的东西之间,即使在调试之后也是如此。

但让我们从头开始。我有一个使用 NestJS 作为框架的节点编写的 API。 NestJS 自动创建 swagger/openapi json 文件。我使用 swagger-codegen 创建了一个 PHP 类来从另一台服务器访问 API。像一个简单的 API 请求的魅力一样工作。

现在的问题是 API 请求返回更大的响应,即来自一个或多个数据库的 >1000 行。不要让客户端等待很长时间,并在我已切换到 NDJSON 的服务器上创建一个大的 JSON 响应,它将响应拆分为较小的 JSON 部分块,每个部分都在它自己的行上。当我使用 curl 或使用 fopen 和 fread 的 PHP 中的 HTTP 包装器手动创建我的请求时,这也有效。响应类型为 application/x-ndjson。

但是 swagger-codegen 生成的代码总是等到收到整个响应。更糟糕的是,因为它无法使用 json_decode() 解码 NDJSON 并且只返回 null。下面使用 Guzzle,它使用 PSR7 流进行响应。

现在我可以跳过自动生成的 NDJSON 端点代码。但我不希望添加特殊处理并丢失所有有用的生成检查。

那么是否有可能让 swagger-codegen 访问响应流?我是否缺少 codegen 的参数或招摇 JSON 中的某些内容?它确实有一个带有 application/x-ndjson 的产品。

【问题讨论】:

    标签: php swagger openapi swagger-codegen ndjson


    【解决方案1】:

    请回答我自己的问题,这是可能的,但不容易——这意味着没有选项或参数。

    首先创建一个扩展自动生成的 API 类的类。在那里,您可以访问所有受保护的方法。我们假设端点或 api 方法称为testMethodGet。唯一可以重用的是请求方法,即testMethodGetRequest,但它完成了所有客户端验证和输入数据的转换,所以这已经是一个很大的胜利。还可以获得一些样板结果验证,您可以复制“http info 方法”,即testMethodGetWithHttpInfo(如果您愿意,请使用异步版本)。删除 $responseBody = $response->getBody(); 之后的 if/else 块,并在返回中将 ObjectSearializer 行替换为 $responseBody

    您现在得到的是作为 PSR7 流的主体,但还有最后一个问题。默认情况下,整个响应被排入一个临时文件。要在创建的方法中真正从服务器流式传输结果主体,请在 $options 中添加一个选项:$options['stream'] = true; 现在该方法会在主体启动后立即返回。无需等待整个正文内容。

    还有一件事。结果是 PSR7 流,如果您更喜欢使用普通文件和流方法,可以使用 $stream->detach() 获取 PHP 流资源。

    【讨论】:

      猜你喜欢
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多