我有一个奇怪的问题。我希望我能解释一下。
我在后端加密了一些东西,API 响应返回一个加密格式的纯字符串,如下所示:
jZAYo65r+FMcGlIAofzZFcqKQmORC7w6OKnSIoo4p3OT12798/xiERKUFO69mVaFSTk7hqyVgaElaDM+i50JqSuDGFD55fdvDPT1UQ3GkMN0v4JiBrbAuEnZCcTeDDfFjSGlZZPaYRzuVaLTPLuqijIURTD31POc8taBJ1tybifK/B//CoZR9xg9I3icZVtwxgBwS9su6anV2k1cVLcBhsj657AgANmzaoaJ5UrJslJVzF9+FKEV43mWEtElOz0Z+WoAXOxQ0/64WLAuqQKu3g0c9FPiO/XtMmh7Hip8VQ4qUlf4bP8imOzsrLGb2OIa0QmmgiSw8GH03HEIO5t0tisuSi5ru8kPSjCH1+oe86MGWfP4MReg6i7fnMc1cIZIJrPCLt2TrWTzdDqKy1Cm/RQ9D5ffyz7ewd7f/PDMU3cij5Pl8GJPzn4Mop+afCv3k474WLOo3JPrHrIIDN2ELT8//auqttTo/AssW6ZlNKIR1LdnFkdrGkqsO+TPFvYznFK7Sfz3uM12gn7sNL2i6pC8airelQhg9XCzbe/uxn8199k5CY/hV4jj1+1NqTaxPhNZ4ECwvqgic4Vy21KXC6AR79r9MysHY1hO97nBiHaWF6NoIoFMBCycjNksMTCfykNUe0EOEb86LdEdAGbsdOGkQDfqYZk6I9wsWS64+9i3ORWpXM+Zz41lf7yl4e6626ZMMpll17cLXQyW8n8e0HjvZEr0u0tmfG4EEt//nydBKymsvuaOz4VtTHeIXloQBTEOYaCGn0iyFbEhJWehgJp+inmm5mcjc46kXkKhBCfZsHKU1mQJmkcjT5xWf2nwSyWtre1dPUc7wbphEM9cWh/E5lWWDKseGOf6V49Jf7xXVWYPOrjneYUKZYSYom1UkiwMyQWqsuYDcpgHYf
现在,在 Angular 客户端中,我有将上述代码转换为 JSON 响应的解密逻辑,我需要在 UI 中显示该响应。
由于我需要过滤特定的 APIS 进行解密,因此我正在修改拦截器中的响应,如下所示:
return next.handle(request).pipe(
map((event: HttpEvent<any>) => {
if (event instanceof HttpResponse && request.url.search('/decryptAPI') !== -1) {
event = event.clone({body: this.modifyBody(request, event.body)});
console.log('event', event);
}
return event;
}));
private modifyBody(request: any, response: any): any {
console.log('request URL', request.url);
const data = decryptBackendResponse(response);
return JSON.parse(data);
}
但是我用于 HTTP 调用的服务是这样的:
getWithText(url: string): Observable<any> {
const headers = new HttpHeaders().set('Content-Type', 'text/plain; charset=utf-8');
return this.http.get(url, { headers, responseType: 'text'});
}
到目前为止一切都很好,但是一旦我修改了代码,并且一个组件订阅了它,我在控制台中收到错误:
error Error: Response is not a string.
at MapSubscriber.project (http.js:1122)
at MapSubscriber._next (map.js:29)
at MapSubscriber.next (Subscriber.js:49)
at FilterSubscriber._next (filter.js:33)
at FilterSubscriber.next (Subscriber.js:49)
我认为问题在于 HTTP 响应类型是导致订阅失败的文本,而它获取的解密内容是 JSON。
如果我将 getWithText() 响应更改为 JSON,则拦截器 HTTP 调用本身将失败,因为响应类型是加密字符串。
我该如何解决这个问题?有什么办法,我可以通过接受 JSON 响应来使我的订阅代码工作。提前致谢。