Ember.js Rest Adapter:无根映射 JSON(.NET Web API)

Posted

技术标签:

【中文标题】Ember.js Rest Adapter:无根映射 JSON(.NET Web API)【英文标题】:Ember.js Rest Adapter: mapping JSON with no root (.NET Web API) 【发布时间】:2013-03-28 04:37:50 【问题描述】:

我有一个使用 .NET Web API 编写的现有服务。

例如,此服务以以下格式返回 JSON:

[
   "id": 1, "name": "John" ,
   "id": 2, "name": "Jane" 
]

但是,根据 Ember.js Rest Adapter documentation,Ember 期望 JSON 采用以下格式:


  "persons": [
     "id": 1, "name": "John" ,
     "id": 2, "name": "Jane" 
  ]

因此,Ember 返回以下错误: 您的服务器返回了一个带有密钥 0 的哈希,但您没有它的映射

我绝不打算更改我的服务 API 及其返回数据的方式。

是否可以让 Ember.js(最新版本)处理我的服务返回的现有数据?如果是这样,我该如何实现?

【问题讨论】:

【参考方案1】:

Ember 在这个意义上非常灵活,能够扩展适配器和序列化程序,以便将您的应用与任何后端 API 集成。

您应该获得 WebAPIAdapter,它是 Ember.js Template for Web API 的一部分。

此外,您可能想看看我作为示例编写的this project,它基于相同的模板(我自己做了一些修改)。它仍在开发中,还没有包含所有最佳实践(目前),但我认为这是一个有效的示例。

您还应该看看这个repo / library(您也可以安装它via NuGet),它允许您将Handlebars 模板直接预编译到Ember.TEMPLATES 集合中。

【讨论】:

谢谢!在您的 Ember-Contact-Management-WebAPI 中,您是否正在对数据进行任何特殊的调整或序列化以使用 Ember?我注意到您的 ContactController 返回 IEnumerable 或 ContactDto 获取。这几乎就是我的 Web API 控制器公开的内容,但是,我的格式不正确。 检查this directory,您将看到 Web API Adapter & WebAPISerializer 的定义,它处理 JSON 有效负载与 Ember-Data 的集成。这些类扩展了内置的 RESTAdapter 和 RESTSerializer。 这正是我所需要的。然而,由于某种原因,使用 DS.WebAPIAdapter,Ember 现在将我的 REST 服务 URL 作为单数名词。例如,在使用 RestAdapter 之前,它会命中localhost/api/things。现在它点击localhost/api/thing。有什么想法吗? 你应该在你的适配器中设置plurals。 This 语法对修订版 4 有效,但我们目前处于修订版 12。老实说,我不知道这部分 API 是否已更改 我知道这很奇怪,但是 .NET 中的大多数 API 不会将控制器复数,这就是为什么 WebAPIAdapter#pluralize 只是按照定义的方式返回模型的名称,只是小写。您可以从 WebAPIAdapter 中删除此方法(回退到 RESTAdapter#pluralize)或编辑它以返回 + 's'...【参考方案2】:

在 web api 中只返回 new object

var persons = _personbService.GetPeople;
        return new  persons ;

这会将您的对象包装在同名对象中。如果您需要调用该对象的其他东西,只需执行

new  SomeOtherName = persons; 

【讨论】:

这仅在您从我所知道的范围内返回单个对象时才有效。如果您有关系(例如 BlogPost/Comments),那么 cmets 会在 BlogPost 内部返回,这似乎违反了默认设置。 ember web api 包会处理它npmjs.com/package/ember-web-api【参考方案3】:

我在 ember 中遇到了这个问题,发现对我来说最好的解决方案是构建一个新的序列化程序并覆盖 normalizePayload 方法。代码如下:

export default DS.RESTSerializer.extend(
normalizePayload: function(payload) 
var root = "posts";
var output = ;
output[root] = payload;
return output;

);

这包装了初始响应并为其添加了根,希望对您有所帮助!

【讨论】:

以上是关于Ember.js Rest Adapter:无根映射 JSON(.NET Web API)的主要内容,如果未能解决你的问题,请参考以下文章

图片上传Ember JS和Sails JS

用于 Restful 后端的 Ember.js 或 Backbone.js [关闭]

Ember.js:如何加载音频文件

如何为 ember.js 创建自定义适配器?

REST Adapter实现SAP PI中的增强XML/JSON格式转换

REST Adapter实现SAP PI中的增强XML/JSON格式转换