角度HttpClient返回字符串数据,而不是解析的JSON
我一直在将代码库从Angular 4.x迁移到5.x的过程中,遇到了一个奇怪的问题。我有一个服务函数,用于将对象列表返回到前端,然后将其转换为特定的数据格式。我知道我需要保留映射,但我有点恼火,因为它只返回纯字符串数据 最初的功能是:(使用刚刚重命名为HttpClient的Http from角度HttpClient返回字符串数据,而不是解析的JSON,json,angular,angular-httpclient,Json,Angular,Angular Httpclient,我一直在将代码库从Angular 4.x迁移到5.x的过程中,遇到了一个奇怪的问题。我有一个服务函数,用于将对象列表返回到前端,然后将其转换为特定的数据格式。我知道我需要保留映射,但我有点恼火,因为它只返回纯字符串数据 最初的功能是:(使用刚刚重命名为HttpClient的Http from@angular/Http) 问题是它有点违背了新客户端解析json的目的。response对象是一个字符串,表示我请求的数据的JSON,但它仍然是字符串形式,而不是get()调用中定义的类型 我做错了什么?
@angular/Http
)
问题是它有点违背了新客户端解析json的目的。response
对象是一个字符串,表示我请求的数据的JSON,但它仍然是字符串形式,而不是get()
调用中定义的类型
我做错了什么?它不应该已经被解析了吗
Chrome开发工具中的网络工具的响应数据示例:
样本响应主体:
值为response
后端(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迁移之前的工作方式,它使用一个JSON.parse()
返回行中的数据只是一个标准的列表
,我想引用一个答案。希望它能让我对事情的运作有所了解,仔细阅读它让我明白,这并不容易找到
TypeScript仅在编译时验证对象接口。无法验证代码在运行时获取的任何对象
打字稿
如果是这种情况,那么HttpClient.Get之类的东西就不应该出现
返回T类型的Observable。它应该返回Object类型的Observable,因为
这就是实际返回的内容。试图声明它返回T
当它返回时,对象是误导性的
在文件中,客户的退货部分说明:
@将主体的可观察的返回为
键入T
实际上,文件应说明:
@返回一个可观察到的
可能是T
。你没有得到回报。如果你得到了T,它会回来的
实际上是T,但不是
这就是数据的原始响应的样子:
[{“Id”:1234,“Name”:“Chris Rutherford”}]
但事实上它看起来是这样的:
“[{\“Id\”:1234,“Name\”:“Chris Rutherford\”}]
因此,在服务器代码的某个地方,您已经应用了两次JSON编码。一旦您纠正了这一点,HttpClient
将做正确的事情。默认情况下应该这样做。检查浏览器的调试工具并导航到“网络呼叫”选项卡。查找到该端点的网络呼叫。http头是否包含正确的内容类型
头和值json?那么响应呢,它是一个数组还是一个包含数组的对象?是的,它返回为application/json,但仍然是一个字符串。您没有回答我评论中的第二个问题。请在您的问题中包括逐字回复消息正文以及回复http标题。网络信息的屏幕截图也是可以接受的。顺便问一下,什么是GetJson
?这不是System.Web.Mvc.Controller
上的方法,我也找不到System.Web.Mvc.Controller
的扩展方法。也许您可以轻松地修复服务器端代码,但您必须在问题中包括如何调用该代码。但什么是GetJson
?这不是mvc库中包含的调用,因此它可能是代码中的自定义实现。请在您的问题中包括该方法的实现。我可以理解它,直到最后一部分。@ChrisRutherford编辑为可以理解,但请阅读链接文章,它将帮助您详细了解
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;
});
}
[HttpGet]
public JsonResult Vendors(bool showAll = false, int screenArea = 0)
{
var vendors = _commonBL.GetVendorsSlimForUser(UserModel, UserModel.CustomerId, showAll, screenArea);
return GetJson(vendors);
}