我的 Angular 应用程序中有一个 post 方法,它的主体为空。内存中的 web api 不断给出 null 没有 item.id 错误,但是如果我通过 {} 而不是 null 它工作正常。
我不想更改内存中 Web api 测试的实际发布调用,所以想知道是否有任何方法可以使我的内存中 Web api 不尝试添加任何内容或将 null 转换为 {}。基本上我的 post 方法除了 ping 服务器之外并没有多大作用
我的 Angular 应用程序中有一个 post 方法,它的主体为空。内存中的 web api 不断给出 null 没有 item.id 错误,但是如果我通过 {} 而不是 null 它工作正常。
我不想更改内存中 Web api 测试的实际发布调用,所以想知道是否有任何方法可以使我的内存中 Web api 不尝试添加任何内容或将 null 转换为 {}。基本上我的 post 方法除了 ping 服务器之外并没有多大作用
我和你有同样的问题。在尝试使用in-memory-web-api尝试覆盖post
类似于自述文件的方法之后,parseRequestUrl
我并没有取得太大的成功;只是到那里的一部分。
相反,我选择使用AngularHttpInterceptor
,这似乎是现在回顾的合乎逻辑的决定。
创建一个检查空 POST 正文的 HTTP 拦截器类。如果找到,克隆请求,因为它应该被认为是不可变的,并将主体设置为空对象{}
。如果有 POST 正文,则照常继续请求。然后将拦截器导入AppModule
并包含在模块providers
数组中。
创建文件http-post-interceptor.ts
import { Injectable } from '@angular/core';
import {
HttpEvent,
HttpInterceptor,
HttpHandler,
HttpRequest
} from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable()
export class HttpPostInterceptor implements HttpInterceptor {
constructor() {}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
// if request body is falsey
if (!req.body) {
// clone immutable request and set empty POST body
const request = req.clone({ body: {} });
// continue with our modified POST request
return next.handle(request);
}
// else continue with the unmodified POST
return next.handle(req);
}
}
将HttpPostInterceptor
和HTTP_INTERCEPTORS
导入app.module.ts
// ...
import { /*...*/ HTTP_INTERCEPTORS } from '@angular/common/http';
import { HttpPostInterceptor } from './http-post-interceptor';
// ...
@NgModule({
// ...
providers: [
{ provide: HTTP_INTERCEPTORS, useClass: HttpPostInterceptor, multi: true }
],
// ...
})
这里的所有都是它的。
这已经解决了我在本地环境中的问题,因此我不再收到您的问题中指出的错误。
在生产构建中禁用
由于in-memory-web-api
通常是非生产工具,您可能希望在生产构建中排除它。为此,请导入您的environment
设置并检查生产属性是否为true
或false
。这可以根据您的需要在拦截器或模块中完成。下面的示例通过AppModule
.
将您的environment
设置导入app.module.ts
// ...
import { environment } from '../environments/environment';
// ...
@NgModule({
// ...
providers: [
environment.production ? [] :
{ provide: HTTP_INTERCEPTORS, useClass: HttpPostInterceptor, multi: true }
]
// ...
})
注意:某些导入路径可能会根据您的项目结构而有所不同,如果您使用的是 Angular 6,尤其是Observable
从rxjs