NSwag生成Angular 5 API服务后如何获取JSON响应?
问题分析与解决办法
嘿,我一眼就瞅出问题根源啦——NSwag生成的服务代码里,压根没把服务器返回的JSON数据解析并返回!
看你贴的NSwag生成的代码片段,当接口返回200状态码时,它处理完响应文本后直接返回了Observable.of<void>(<any>null),这就是为啥你订阅的时候始终拿到null的原因!
具体问题点
这段生成的代码是罪魁祸首:
if (status === 200) { return blobToText(responseBlob).flatMap(_responseText => { return Observable.of<void>(<any>null); // 这里直接返回了null,完全没处理响应数据 }); }
解决步骤
1. 临时修复:手动修改生成的服务代码
找到生成的processApiSubmissionGetResultMessageGet方法,把返回null的逻辑改成解析响应文本为你的数据模型:
// 假设你的接口返回的是SubmissionDocument类型(根据实际情况替换) if (status === 200) { return blobToText(responseBlob).flatMap(_responseText => { const responseData = JSON.parse(_responseText) as SubmissionDocument; return Observable.of(responseData); // 返回解析后的真实数据 }); }
同时要把方法的返回类型从Observable<void>改成Observable<SubmissionDocument>(对应你的实际数据类型)。
2. 永久解决:调整NSwagStudio配置避免重复手动修改
你肯定不想每次重新生成代码都改一遍,所以要在NSwagStudio里调整生成配置:
- 先确保你的Swagger/OpenAPI文档里,这个接口的
responses.200.schema正确定义了返回数据的模型(不是空或者void类型)。 - 在NSwagStudio的Angular生成选项里:
- 勾选「Generate DTOs」,让NSwag自动生成对应的数据模型类。
- 检查「Response Type」相关设置,确保它识别到接口的返回类型,而不是默认生成void类型的返回Observable。
3. 验证你的订阅代码
修改完服务后,你的订阅逻辑就能正常拿到数据了:
getSubmissionDetails(documentId: string): void { this.client.apiSubmissionGetSubmissionDocumentGet(documentId) .subscribe( data => { this.submissionList = data; // 现在可以正确赋值了 console.log('data: ', data); }, (error: any) => this.errorMessage = error ); }
额外提示
如果不确定接口返回的数据模型,可以先在浏览器开发者工具的「Network」标签里查看该接口的响应内容,确认JSON结构后,要么手动创建对应的TypeScript接口,要么让NSwag从Swagger文档自动生成DTO类。
内容的提问来源于stack exchange,提问作者Probandot
相关产品推荐
相关产品推荐

