【发布时间】:2021-03-15 07:09:14
【问题描述】:
我一直在将代码库从 Angular 4.x 迁移到 5.x,但遇到了一个奇怪的问题。我有一个服务功能,旨在将对象列表返回到前端,然后我将其按摩成特定的数据格式。我知道我需要保留映射,但我有点生气它只返回纯字符串数据。
原来的功能是这样的:(使用来自@angular/http的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 代码后,再次使用来自 @angular/common/http 的 HttpClient 的函数
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 Network Tools 响应数据示例:
示例响应正文:
后端 (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>
【问题讨论】:
-
默认情况下应该。检查浏览器的调试工具并导航到网络调用选项卡。查找对该端点进行的网络调用。 http 标头是否包含正确的
content-type标头和值 json?那么响应呢,它是一个数组还是一个包含数组的对象? -
是的,它以 application/json 的形式返回,但仍然是一个字符串。
-
您没有回答我评论中的第二个问题。请在您的问题中包含逐字响应消息正文以及响应 http 标头。网络信息的屏幕截图也是可以接受的。
-
顺便说一句,
GetJson是什么?这不是System.Web.Mvc.Controller的方法,我也找不到System.Web.Mvc.Controller的扩展方法。也许您可以轻松修复服务器端代码,但您必须在问题中包含如何调用它。 -
但是
GetJson是什么?这不是 mvc 库中包含的调用,因此它可能是您代码中的自定义实现。请在您的问题中包含该方法的实现。
标签: json angular angular-httpclient