Estoy jugando con angular-in-memory-web-api para Angular 2. Hasta ahora solo he estado usando llamadas GET y funciona bien.
La API a la que llamaré solo usa llamadas POST, así que comencé a reescribir mis llamadas GET a llamadas POST, pero luego dejaron de devolver los datos simulados. En mi función de prueba a continuación, quiero obtener los datos como un objeto TestResponse por una identificación:
postTest(id: string): Promise<TestResponse> { return this.http .post(this.testUrl, JSON.stringify({ testId: id }), { headers: this.headers }) .toPromise() .then(response => response.json().data as TestResponse) .catch(this.handleError); }Y los datos simulados:
let test = [ { testId: 'e0d05d2b-3ec3-42ae-93bc-9937a665c4d6', missingData: 'qwerty', moreMissingData: 'asdfgh' }, { testId: 'dccef969-b9cf-410a-9973-77549ec47777', missingData: 'qwerty', moreMissingData: 'asdfgh' }, { testId: '20716fd7-1f50-4a12-af16-52c009bc42ab', missingData: 'qwerty', moreMissingData: 'asdfgh' } ];Si entiendo esto correctamente, este código asumirá que quiero crear algo y, por lo tanto, devolverá mi testId junto con id: 1 (que ni siquiera sigue mi estructura de datos).
Entonces, mi pregunta es, ¿cómo puedo obtener mis datos simulados con llamadas POST?
Es posible anular los métodos HTTP en la implementación del servicio de datos en memoria.
En el método anulado (por ejemplo, POST), es posible reaccionar al nombre de la colección (a través del parámetro RequestInfo ) para proporcionar una funcionalidad específica por punto final/colección.
Un ejemplo proporcionado trata solo con llamadas GET: https://github.com/angular/in-memory-web-api/blob/master/src/app/hero-in-mem-data-override.service.ts
A partir de eso, anular la funcionalidad POST podría verse así:
import { InMemoryDbService, RequestInfo, STATUS, ResponseOptions } from 'angular-in-memory-web-api'; export class Your InMemoryDataService implements InMemoryDbService { // ... post(requestInfo: RequestInfo) { const collectionName = requestInfo.collectionName; if (collectionName === 'somedatatype') { // Intercept POST calls to the 'somedatatype' collection: // Eg add some fields to our entity that would be set in the backend, const data = requestInfo.utils.getJsonBody(requestInfo.req); const collection = requestInfo.collection; data.extraField = 'hello'; // set id to next highest number data.id = collection.map(item => item.id).reduce((cur, next) => cur > next ? cur : next) + 1; // ... add the item to the collection collection.push(data); // forge the response const options: ResponseOptions = { body: { data }, status: STATUS.OK, headers: requestInfo.headers, url: requestInfo.url }; // use createResponse$ to return proper response return requestInfo.utils.createResponse$(() => options); } // let the default POST handle all other collections by returning undefined return undefined; } }