如何拦截调用并动态返回JSON文件(无“导入”)

如何拦截调用并动态返回JSON文件(无“导入”),json,angular,mocking,angular8,angular-http-interceptors,Json,Angular,Mocking,Angular8,Angular Http Interceptors,我有一个文件夹和json文件的脚手架来模拟API的路径。当我运行npm run start:mock时,LocalMockInterceptor将被设置,例如,用获取本地文件夹a/Folder B/C.json的http调用替换对主机/a/B/C的调用。JSON文件是由一个单独的脚本生成的,它超出了本文的范围。我不能像许多教程所显示的那样使用“导入”,因为我需要一个通用的解决方案,因为我正在模拟的API将随着时间的推移而发展(文件夹和文件的支架也将如此) /** *我们的想法是,只有在我们指定的

我有一个文件夹和json文件的脚手架来模拟API的路径。当我运行
npm run start:mock
时,
LocalMockInterceptor
将被设置,例如,用获取本地文件夹a/Folder B/C.json的http调用替换对主机/a/B/C的调用。JSON文件是由一个单独的脚本生成的,它超出了本文的范围。我不能像许多教程所显示的那样使用“导入”,因为我需要一个通用的解决方案,因为我正在模拟的API将随着时间的推移而发展(文件夹和文件的支架也将如此)

/**
*我们的想法是,只有在我们指定的情况下(例如,在TeamCity上,在您的本地主机上),才将其构建到bundle中,而您不想依赖它
*关于发展的外部资源
*代码包中没有条件!没有配置文件或数据库依赖项。
*/
进口{
HttpInterceptor,
HttpResponse,
HttpHandler,
HttpRequest,
HttpEvent,
HttpClient,
HttpHeader
}来自“@angular/common/http”;
从“@angular/core”导入{Injectable,Injector};
从'rxjs'导入{可观察的};
从“./error.service”导入{ErrorService};
const devAssetsFolder='资产';
@可注射()
导出类LocalMockInterceptor实现HttpInterceptor{
建造师(
私人errorService:errorService,
专用注射器:注射器,
私有http:HttpClient
) {}
拦截(
请求:HttpRequest,
下一步:HttpHandler
):可见{
if(request.url.endsWith('.json'))返回next.handle(request);
console.log(
`>>>模拟侦听器>>>${request.url}已被侦听`
);
const path=`${devAssetsFolder}${request.url}.json`;
var promise=this.getJSON(path.toPromise();
const jsonheaders=新的HttpHeaders();
set('Content-Type','application/json');
让json2;
承诺
。然后(json=>{
log(json);
json2=json;
})
.catch(错误=>console.log(错误));
承诺。全部([承诺]);
log(json2);
归还(
新的HttpResponse({status:200,body:json2,headers:jsonheaders})
);
}
私有getJSON(jsonPath:string):可观察{
返回this.http.get(jsonPath);
}
}
  • 第一个条件是避免无限循环,因为我在侦听器中发送HTTP请求
  • 基于URL获取JSON文件的路径非常自然
  • 在我看来,我必须将JSON可观测值转换为承诺,以便在将JSON重新包装为返回的可观测值之前等待它完成。然而,在调试时,它似乎是
    Promise.all
    并没有等待Promise完成(
    json2
    在下一行中未定义),我最终返回了一个空的http正文

  • 如何修复这个rxjs承诺
  • 内部HTTP调用是我唯一的选择吗
  • 有没有办法不依赖承诺?你能想出一个更好的方法来实现这一点吗

您是否尝试在拦截器中修改目标URL?您希望进行一个API调用以返回一些JSON,但不想调用动态API,只想调用静态服务器,以便它可以返回预定义的JSON

  intercept(
    request: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    const fakeUrl = `${devAssetsFolder}${request.url}.json`;
    const fakeRequest = request.clone({url: fakeUrl});
    return next.handle(request);
  }
拦截(
请求:HttpRequest,
下一步:HttpHandler
):可见{
const fakeUrl=`${devAssetsFolder}${request.url}.json`;
const fakeRequest=request.clone({url:fakeUrl});
下一步返回。处理(请求);
}

您是否尝试在拦截器中修改目标URL?您希望进行一个API调用以返回一些JSON,但不想调用动态API,只想调用静态服务器,以便它可以返回预定义的JSON

  intercept(
    request: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    const fakeUrl = `${devAssetsFolder}${request.url}.json`;
    const fakeRequest = request.clone({url: fakeUrl});
    return next.handle(request);
  }
拦截(
请求:HttpRequest,
下一步:HttpHandler
):可见{
const fakeUrl=`${devAssetsFolder}${request.url}.json`;
const fakeRequest=request.clone({url:fakeUrl});
下一步返回。处理(请求);
}

经过几次修改后,我无法编译此文件。我同意Noemi的解决方案,但我很想看到这个解决方案也能起作用,因为我的理解是,在做了一些修改之后,我无法编译这个解决方案。我同意Noemi的解决方案,但我有兴趣看到这个解决方案也能发挥作用。
 return this.getJSON(path); // it's an observable, so it's OK.
  intercept(
    request: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    const fakeUrl = `${devAssetsFolder}${request.url}.json`;
    const fakeRequest = request.clone({url: fakeUrl});
    return next.handle(request);
  }