2013-04-05 13 views
8

Ho un servizio esistente scritto con .NET Web API.Ember.js Rest Adapter: mapping JSON senza radice (API Web .NET)

A titolo di esempio, questo servizio restituisce JSON nel seguente formato:

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

Tuttavia, come per il Ember.js Rest Adapter documentation, Ember si aspetta JSON nel seguente formato:

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

A causa di questo , Ember restituisce il seguente errore: Il server ha restituito un hash con la chiave 0 ma non ha alcuna mappatura per esso

In nessun modo ho intenzione di modificare la mia API di servizio e come restituisce i dati.

Sarebbe possibile ottenere Ember.js (ultima versione) per lavorare con i dati esistenti che il mio servizio sta restituendo? E, in tal caso, come posso implementarlo?

risposta

5

Ember è molto flessibile in questo senso, offrendo la possibilità di estendere l'adattatore e il serializzatore per integrare l'app con qualsiasi API di back-end.

È necessario ottenere WebAPIAdapter, che fa parte di Ember.js Template for Web API.

Inoltre, potresti dare un'occhiata a this project Ho scritto un esempio, basato su quello stesso modello (con alcune modifiche che ho fatto da solo). È ancora in fase di sviluppo e non presenta tutte le migliori pratiche (ancora), ma direi che è un esempio valido.

Si dovrebbe anche dare un'occhiata a questo repo/library (È possibile installarlo anche via NuGet), che consente di precompilare i modelli di Handlebars direttamente nella raccolta Ember.TEMPLATES.

+0

Grazie! In Ember-Contact-Management-WebAPI, stai facendo uno speciale adattamento o serializzazione dei dati per lavorare con Ember? Ho notato che ContactController restituisce IEnumerable o ContactDto per ottenere. Questo è praticamente ciò che espone il mio controller API Web, tuttavia, il formato non è corretto sulla mia parte. –

+1

Controlla [questa directory] (https://github.com/MilkyWayJoe/Ember-Contact-Management-WebAPI/tree/master/Ember-Contact-Management-WebAPI/Scripts/app), vedrai la definizione del Web API Adapter e WebAPISerializer, che gestisce l'integrazione del payload JSON con Ember-Data. Queste classi stanno estendendo il built-in RESTAdapter e RESTSerializer. – MilkyWayJoe

+0

Questo è esattamente ciò di cui avevo bisogno. Tuttavia, per qualche motivo, utilizzando DS.WebAPIAdapter, Ember ora colpisce l'URL del mio servizio REST come nome singolare. Ad esempio, prima di usare il RestAdapter, questo avrebbe colpito http: // localhost/api/things. Ora colpisce http: // localhost/api/thing. Qualche idea? –

0

nel Web API appena return new {oggetto}

var persons = _personbService.GetPeople; 
     return new { persons }; 

questo avvolgere l'oggetto in un oggetto con lo stesso nome. Se avete bisogno di chiamare l'oggetto qualcos'altro basta fare

new { SomeOtherName = persons; } 
+0

Funziona solo se si restituisce un singolo oggetto da quello che posso dire. Se si hanno relazioni (ex BlogPost/Commenti), i commenti vengono restituiti all'interno di BlogPost che sembra rompere i valori predefiniti. Il pacchetto ember web api si prende cura di esso https://www.npmjs.com/package/ember-web-api –

0

ho avuto questo problema in brace e trovato la soluzione migliore per me è stato quello di costruire un nuovo serializzatore e l'override del metodo normalizePayload. codice sotto:

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

} });

Questo avvolge la risposta iniziale e aggiunge la radice ad esso, spero che aiuti!