He visto esto , pero la pregunta quedó sin respuesta. Así que haciendo esta pregunta de nuevo.
Estaba tratando de implementar un PUT. Lo cual no funcionó, verifiqué la información de requestInformation y la response en responseInterceptor . Resulta que el control nunca llega a mi responseInterceptor .
Este es el código http:
put(url: string, body, options?:RequestOptionsArgs): Observable<StandardModelResponse>{ console.log("inside put, url = ", url, " body = ", body); return this._http.put(url,body,this._updateRequestHeader(options)); }El registro recibido es:
Mi InMemoryDbService tiene una colección:
let sessionData = [ { id: 1, loginActive: 0 } ];y devuelve la colección así:
return {sessionData} Miré a través de la fuente , y sí, de hecho, hay una implementación de publicación y colocación, pero no pude encontrar el archivo in in-memory-backend.service.ts en mis node-modules para la depuración, en lugar de un in-memory-backend.service.js está ahí. ¿Cuál es la forma correcta de hacer esta llamada POST ? ¿Qué me estoy perdiendo aquí?
Puede "anular" (no estoy seguro de si eso es lo que está sucediendo) el método de publicación agregándolo en su implementación de InMemoryDbService
import { InMemoryDbService } from 'angular-in-memory-web-api'; import { getStatusText, STATUS } from 'angular-in-memory-web-api/http-status-codes'; import { ParsedRequestUrl, RequestInfo, RequestInfoUtilities, ResponseOptions } from 'angular-in-memory-web-api/interfaces'; ..... post(reqInfo: RequestInfo) { } ...Puede implementarlo para hacer algo como la implementación del método get como se hace aquí: fuente
Espero que eso ayude. Parece funcionar :)
Es una pregunta bastante antigua, pero no he encontrado ninguna respuesta que describa cómo parchear InMemoryDbService que necesita personalizar o corregir un controlador de una operación PUT o POST. Como recientemente me enfrenté a una situación similar, decidí publicar mi solución aquí para que alguien pueda encontrarla útil.
Como ya se mencionó anteriormente, las funciones de publicación y colocación se pueden anular. Por ejemplo, el siguiente código inserta un nuevo elemento en el método de publicación y actualiza un elemento existente en el método de colocación .
export class InMemoryDatabase extends InMemoryDbService { createDb() { const heroes = [ {id: 1, name: 'Superman'}, {id: 2, name: 'Biowulf') ]; return { heroes }; } post(reqInfo: RequestInfo) { var collection = reqInfo.collection; // process only requests as /api/object/:id if (!collection) return reqInfo.utils.createResponse$(() => { const options: ResponseOptions = { status: STATUS.NOT_FOUND }; return this.finishOptions(options, reqInfo); }); // insert an object to the collection let item = reqInfo.utils.getJsonBody(reqInfo.req) item["id"] = this.genId(collection); collection.push(item); // respond return reqInfo.utils.createResponse$(() => { const options: ResponseOptions = { body: item, status: STATUS.OK } return this.finishOptions(options, reqInfo); }); } genId(collection: any): number { return collection.length > 0 ? Math.max(...collection.map(hero => hero.id)) + 1 : 11; } put(reqInfo: RequestInfo) { var collection = reqInfo.collection; // process only requests as /api/object/:id if (!collection || !reqInfo.id) return reqInfo.utils.createResponse$(() => { const options: ResponseOptions = { status: STATUS.NOT_FOUND }; return this.finishOptions(options, reqInfo); }); // update an object let item = reqInfo.utils.findById(collection, reqInfo.id); const body = reqInfo.utils.getJsonBody(reqInfo.req) Object.assign(item, body); // respond return reqInfo.utils.createResponse$(() => { const options: ResponseOptions = { body: item, status: STATUS.OK } return this.finishOptions(options, reqInfo); }); } private finishOptions(options: ResponseOptions, { headers, url }: RequestInfo) { options.statusText = getStatusText(options.status); options.headers = headers; options.url = URL; return options; } }