angular - 如何使用离子原生 http 访问资产目录?
问题描述
我有一个使用 ionic 5 开发的应用程序,用于管理我使用本机 http 插件的设备上的 http 调用。在启动时,应用程序必须访问 assets 文件夹以检索带有 ngx tralslate 翻译的 json。迄今为止,我从通话中返回了一个协议错误。这是错误文本:请求出错:无协议:./assets/i18n/it-IT.json 如何访问设备上的资产文件夹?我应该输入什么协议?
import {Injectable} from "@angular/core";
import {
HttpErrorResponse,
HttpEvent,
HttpHandler,
HttpInterceptor,
HttpRequest,
HttpResponse
} from "@angular/common/http";
import {Observable, throwError} from "rxjs";
import {Platform} from "@ionic/angular";
import {HTTP} from "@ionic-native/http/ngx";
import {catchError, finalize, map} from "rxjs/operators";
import {Store} from "@ngrx/store";
import {hideLoader, viewLoader} from "../loader-store/loader.action";
@Injectable()
export class HttpNativeInterceptor implements HttpInterceptor {
constructor(
private platform: Platform,
private http: HTTP,
private store: Store<any>
) {
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const headers = {};
const params = {};
const {method, url} = req;
this.store.dispatch(viewLoader())
return (this.platform.is('capacitor') ? this.callNative(url, method, headers, params) : next.handle(req))
.pipe(
map((resp: HttpEvent<any>) => {
return resp
}),
catchError((error: HttpErrorResponse) => {
return throwError(error);
}),
finalize(() => {
this.store.dispatch(hideLoader())
})
)
}
callNative(url, method, headers, params) {
return new Observable(ob => {
switch (method) {
case 'GET':
this.http.get(url, headers, params).then(
this.successCallback(ob),
this.errorCallback(ob)
)
break;
case 'POST':
this.http.post(url, headers, params).then(
this.successCallback(ob),
this.errorCallback(ob)
);
break;
case 'PUT':
this.http.put(url, headers, params).then(
this.successCallback(ob),
this.errorCallback(ob)
);
break;
case 'DELETE':
this.http.delete(url, headers, params).then(
this.successCallback(ob),
this.errorCallback(ob)
);
break;
}
});
}
successCallback(ob) {
return (response: any) => {
ob.next(new HttpResponse({body: JSON.parse(response.data)}));
ob.complete();
};
}
errorCallback(ob) {
return (response: any) => {
ob.next(new HttpErrorResponse({error: response.error}));
ob.complete();
};
}
}
解决方案
为了回应您在下面的评论,我正在更新我的答案:看来您还需要从ngx-translate 项目中添加 http-loader 帮助程序类。
注意:这是使用 Google 查找的简单解决方案 -> “ngx-translate with local data”
用于历史目的的原始答案位于下方:这不是离子问题或 http 问题。
由于该文件是本地文件,因此无需使用 HTTP。
为了能够在本地读取 json,请将一个名为 njson-typings.d.ts 的文件添加到您的 src 目录
declare module "*.json" {
const value: any;
export default value;
}
然后,您可以在文件顶部导入该信息,如下所示:
import translation from '../assets/i18n/it-IT.json';
注意:您可能必须根据导入的文件更改相对文件路径。
在您的组件本身中,您可以像这样使导入可用:
Translation: any = translation;
然后,您可以在模板或代码中引用它。
参考:如何读取本地 JSON
推荐阅读
- aws-cli - AWS QuickSight 新的 api 操作最近宣布在 CLI 1.16.200 中不可用
- python-3.x - Lambda 超时配置在使用 chalice 部署时重置为 1
- python - 将 Python Tkinter-Treeview 中的行提取到 Pandas 数据框中
- google-bigquery - BigQuery - 计算来自 IoT 设备的活动块
- javascript - 当使用 jquery .val() 方法设置对象字段时,Jquery ajax post 发送 null
- sql-server - SSIS从SP执行sql任务返回码
- javascript - 如何通过单击位于所述标记信息窗口中的按钮来更改标记的颜色(使用传单)?
- python - 如何删除pyglet中的标题栏,我正在做一个飞溅介绍
- spring-boot - spring boot gradle 项目
- sharepoint - 使用 Microsoft Graph API 更新与内容类型关联的 SharePoint 字段