1

我的 Angular 应用程序中有一个 post 方法,它的主体为空。内存中的 web api 不断给出 null 没有 item.id 错误,但是如果我通过 {} 而不是 null 它工作正常。

我不想更改内存中 Web api 测试的实际发布调用,所以想知道是否有任何方法可以使我的内存中 Web api 不尝试添加任何内容或将 null 转换为 {}。基本上我的 post 方法除了 ping 服务器之外并没有多大作用

4

1 回答 1

1

我和你有同样的问题。在尝试使用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);
  }
}

HttpPostInterceptorHTTP_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设置并检查生产属性是否为truefalse。这可以根据您的需要在拦截器或模块中完成。下面的示例通过AppModule.

将您的environment设置导入app.module.ts

// ...
import { environment } from '../environments/environment'; 
// ...

@NgModule({
  // ...
  providers: [
    environment.production ? [] :
      { provide: HTTP_INTERCEPTORS, useClass: HttpPostInterceptor, multi: true }
  ]
  // ...
})

注意:某些导入路径可能会根据您的项目结构而有所不同,如果您使用的是 Angular 6,尤其是Observablerxjs

于 2018-06-01T09:41:32.583 回答