json - Angular HttpClient 返回字符串数据而不是解析的 JSON
问题描述
我一直在将代码库从 Angular 4.x 迁移到 5.x,但遇到了一个奇怪的问题。我有一个服务功能,旨在将对象列表返回到前端,然后我将其按摩成特定的数据格式。我知道我需要保留映射,但我有点生气它只返回纯字符串数据。
原来的功能是这样的:(使用Http从@angular/http
刚刚重命名为HttpClient)
public GetVendors(showAll = true, screenArea: number = 0): Observable<Array<SelectModel>> {
let link = AppSettings.API_COMMON_VENDORS;
let params: URLSearchParams = new URLSearchParams();
params.set('showAll', showAll.toString());
params.set('screenArea', screenArea.toString());
let requestOptions = new RequestOptions();
requestOptions.search = params;
return this.httpClient.get(link, requestOptions).map(response => {
let result = JSON.parse(response.json());
let list = new Array<SelectModel>();
let vendors: Array<any> = result;
vendors.forEach(vendor => {
list.push(this.CreateSelectModel(vendor));
});
return list;
});
}
在撕掉所有的 Http 代码之后,这里的函数再次使用HttpClient
from@angular/common/http
public GetVendors(showAll = true, screenArea: number = 0): Observable<Array<SelectModel>> {
let link = AppSettings.API_COMMON_VENDORS;
let params: HttpParams = new HttpParams()
.set('showAll', showAll.toString())
.set('screenArea', screenArea.toString());
return this.httpClient.get<Array<any>>(link, {params}).map(response => {
let list = new Array<SelectModel>();
response.forEach(vendor => {
list.push(this.CreateSelectModel(vendor));
});
return list;
});
}
问题在于它有点违背了新客户端为我解析 json 的目的。该response
对象是一个字符串,表示我请求的数据的 JSON,但它仍然是字符串形式,而不是get<>()
调用中定义的类型。
我在这里做错了什么?不应该已经解析了吗?
Chrome 开发工具中的示例响应数据 A'la 网络工具:
示例响应正文:
后端 (C#) 响应如下:
[HttpGet]
public JsonResult Vendors(bool showAll = false, int screenArea = 0)
{
var vendors = _commonBL.GetVendorsSlimForUser(UserModel, UserModel.CustomerId, showAll, screenArea);
return GetJson(vendors);
}
这是在 Http => HttpClient 迁移之前的工作方式,它与 ONE 一起工作JSON.parse()
返回行中的数据只是一个标准List<T>
解决方案
我会从这个线程中引用一个答案。希望它能对事情的运作方式有所启发,彻底阅读它,它启发了我,很难找到它。
TypeScript 仅在编译时验证对象接口。TypeScript 无法验证代码在运行时获取的任何对象。
如果是这种情况,那么像 HttpClient.Get 这样的东西不应该返回 T 类型的 Observable。它应该返回 Object 类型的 Observable,因为这就是实际返回的内容。试图声明它在返回 Object 时返回 T 是一种误导。
在文档中,客户的退货部分是这样说的:
@return 一个
Observable
body 作为 typeT
。实际上,文档应该说:
@return
Observable
可能是T
. 你没有得到 T 回来。如果你把 T 找回来,它实际上是 T,但它不是。
推荐阅读
- javascript - 在 html/javascript 中显示“服务年限”的简单方法
- browser - 如何使用内置选项(无浏览器插件)在没有图像的 Windows 10 上将网页转换为 PDF 或纸张?
- c# - 如何使用带有请求正文数据的 POST 方法使用 Azure 函数调用外部 api
- string - 如何根据另一个字符串表(Lua)定义的顺序对字符串表进行排序
- gradle - 如何在 mac 上从 jenkins 运行 testng.xml 文件
- python - 无法让 python 正确格式化日期
- content-management-system - 适用于管理文件并通过公共端点公开文件的无头 CMS
- python - 在python的同一列中添加两个值
- android - 预期为 BEGIN_ARRAY,但在第 1 行第 2 列改造时为 BEGIN_OBJECT2
- python - 终端中的 pip install pyautogui 错误