当前位置: 首页 > 知识库问答 >
问题:

使用swagger和自动生成的php客户端处理分块json响应的正确方法是什么?

邢博文
2023-03-14

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

但让我们从头开始。我有一个使用NestJS作为框架的节点编写的API。NestJS 会自动创建 swagger/openapi json 文件。使用swagger-codegen,我创建了一个PHP类来从另一台服务器访问API。工作方式类似于简单 API 请求的超级按钮。

现在的问题是API请求返回更大的响应,即

但是由swagger codegen生成的代码总是等待直到接收到整个响应。更糟糕的是,它无法用json_decode()解码NDJSON,只返回null。下面使用Guzzle,它使用PSR7流作为响应。

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

那么,是否有可能以某种方式使swagger-codegen能够访问响应流?我是否缺少 codegen 的参数或 swagger JSON 中的某些内容?它确实有一个带有appplication/x-ndjson的产品。

共有1个答案

詹高畅
2023-03-14

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

首先创建一个扩展自动生成的API类的类。在那里您可以访问所有受保护的方法。我们假设endpoint或api方法称为testmetodGet。唯一可以重用的是请求方法,即testMethod odGetRequest,但它完成了所有客户端验证和输入数据的转换,因此这已经是一个很大的胜利。还可以获得一些样板结果验证,您可以复制“超文本传输协议info方法”,即testMethod odGetHttpInfo(如果您愿意,请使用异步版本)。删除$响应主体=$响应后的if/ett块-

你现在得到的是PSR7流的身体,但还有最后一个条件。默认情况下,整个响应被放入一个临时文件中。要在创建的方法中真正从服务器流式传输结果体,请向$options添加一个选项:< code > $ options[' stream ']= true;现在,只要主体启动,方法就会返回。无需等待全身内容。

还有一件事。结果是一个PSR7流,您可以使用$stream-

 类似资料:
  • 所以,我想实现一个非常简单的输出。 我有与字段成功,消息和列表数据响应类。 和请求类 null null 我试过很多方法,但最后都没能做到。

  • 目前正在使用springfox 2.9.2大摇大摆地记录Spring中创建的API。我想在文档中添加示例响应,如下图所示; 我的理解是,我可以做类似的事情: 在本例中,我将此代码片段放在方法的正上方。不幸的是,上面的两个示例总是显示:标识符预期错误 但我也看到我也能做到这一点: 我还看到我可以添加一个级别的示例: 我的问题是: > 将Swagger/Springfox指向my model/bean

  • 问题内容: 我正在使用Spring MVC在SQL Server数据库之上构建薄层。当我开始测试时,似乎不能很好地处理压力:)。我正在使用Apache Commons DBCP 来处理连接池和数据源。 当我第一次尝试同时建立约10-15个连接时,它曾经挂起,不得不重启服务器(对于开发人员,我正在使用Tomcat,但最终我将不得不在Weblogic上进行部署)。 这些是我的Spring bean定义

  • 问题内容: 我使用10gen的本机node.js驱动器将mongodb(2.2.2)与node.js一起使用。 起初一切顺利。但是当涉及到并发基准测试部分时,会发生很多错误。频繁进行1000次并发连接/关闭可能会导致mongodb拒绝任何进一步的请求,并出现以下错误: 另外,如果许多客户端在没有显式关闭的情况下关闭,则mongodb将花费几分钟的时间来检测并关闭它们。这也将导致类似的连接问题。(使

  • 我试试看。js与mongodb(2.2.2)一起使用本机节点。js drive by 10gen。 起初一切都很顺利。但在并发基准测试部分,出现了很多错误。频繁连接/关闭1000次并发可能会导致mongodb拒绝任何进一步的请求,错误如下: 此外,如果很多客户端在没有显式关闭的情况下关闭,mongodb需要几分钟来检测并关闭它们。这也会导致类似的连接问题。(使用/var/log/mongodb/m

  • 使用OkHttp实现异步RESTAPI客户机,工作正常。出于好奇,尝试将其转换为WebClient,观察奇怪的行为。 WebClient配置就是这样: 请求代码: 在单元测试中,作为参数传递给此方法的回调完成了一个Future,我等待它。因此,当我在IDEA中运行测试时,请求产生一个响应,响应的正文为空(内容长度:0),subscribe()中的lambda永远不会执行-使用println调试进行