angular - Angular HttpClient - 处理空和非空响应
问题描述
假设我们有http: HttpClient
,我想提供一个服务调用包装方法,如下所示:
public async post<T>(url: string, body: any): Promise<T> {
// do some stuff
const response = await this.http.post<T>(url, body, this.options).toPromise();
// do more stuff
return response
}
这对任何T
except 都按预期工作void
。我希望(并且仍在寻求实现)的行为是Promise<void>
在服务器未返回任何响应时不返回任何值()。我现在想知道实现这一点的最佳方法是没有针对空响应主体的不同功能。
我认为没有办法根据泛型类型来消除歧义?我试图寻找方法来做到这一点,但似乎没有办法做到这一点,考虑到 TypeScript 的作用和工作原理,这是有道理的。Fwiw,该类型将在调用站点可用(例如,我将调用该方法,因为service.post<void>(...)
我期望一个空的响应主体)。
我想知道的一件事是我是否总是可以让它返回一个字符串 ( responseType: "text"
),然后手动解析 JSON。然后我可以检查状态和响应字符串,如果它们是200
并且""
分别我会知道我可以返回undefined
。如果这是正确的方法(我不确定是不是),我有几个问题:
- 手动解析 JSON 会有性能缺陷吗?
- 我应该使用什么方法来解析它?有什么
HttpClient
用? - 我如何确保错误处理与在
HttpClient.post
方法中发生的错误处理相同?理想情况下,我不希望它偏离HttpClient.post
.
还是我缺少另一种简单的方法来实现所需的方法?我的任何假设都是错误的吗?
解决方案
事实证明,如果服务器返回,这只是一个问题200
。如果服务器返回“无内容”状态204
(适用于空响应正文),则post
返回null
. 我更愿意undefined
与实际的null
JSON 响应区分开来(因为null
它是一个有效的 JSON 令牌),但它就是它的本质,它对我来说已经足够好了。
推荐阅读
- node.js - 如何在 Windows 中为不同的 React 项目使用不同版本的 Nodejs
- ios - 将 RSS 提要加载到 IOS Swift
- npm - @material-ui/core 是否有 Typescript 类型?
- amazon-web-services - 如何为 AWS EC2 实例、S3 存储桶设置内存不足警报?
- go - 是否关闭通道块直到接收器读取它
- php - 声明变量运行变量
- azure-application-insights - 使用正则表达式的应用程序洞察组
- sql - 将两个选择查询合二为一
- json - 协议缓冲区如何比 XML 和 JSON 快?
- c++ - cc1plus:错误:无法识别的命令行选项“-Wno-implicit-fallthrough”[-Werror]