我正在使用自定义HTTP请求类为我的所有请求添加授权标头,这几乎适用于所有
Android设备.现在有线的事情是,我得到了一些客户投诉他们正在获得“无互联网连接”错误,尽管他们有一个有效的网络连接(其他应用程序工作,错误也传输到Sentry服务器).
当我使用Sentry错误跟踪时,我发现这些客户都收到错误,因为在应用程序启动时第一个请求在10秒后抛出超时错误.
我猜这个请求有些问题,所以我为有限数量的用户构建了一个alpha版本来跟踪错误(我将每个请求的选项发送给Sentry),但请求看起来很好.
接下来猜测这些设备上的cordova-plugin-nativestorage存在问题,但是当我抓住它们时,它应该至少返回一个空令牌.不知道如何解决它现在.任何建议表示赞赏!
当我使用Sentry错误跟踪时,我发现这些客户都收到错误,因为在应用程序启动时第一个请求在10秒后抛出超时错误.
我猜这个请求有些问题,所以我为有限数量的用户构建了一个alpha版本来跟踪错误(我将每个请求的选项发送给Sentry),但请求看起来很好.
接下来猜测这些设备上的cordova-plugin-nativestorage存在问题,但是当我抓住它们时,它应该至少返回一个空令牌.不知道如何解决它现在.任何建议表示赞赏!
export class Customrequest { apiToken: string = ''; constructor(private http: Http) { } protected request(options: any): Observable<any> { // If Native Storage doens't find a token,return an empty let errorNativeStorage$= function (): Observable<any> { return Observable.of({ Token: '' }); }; // Get Token form Native Storage let token$= Observable.fromPromise(NativeStorage.getItem('JWT')) .catch(errorNativeStorage$); // Handle request errors let genericError$= function (error: Response | any): Observable<any> { let errMsg: string; if (error instanceof Response) { const body = error.json() || ''; const err = body.error || JSON.stringify(body); errMsg = `${error.status} - ${error.statusText || ''} ${err}`; } else { errMsg = error.message ? error.message : error.toString(); } console.error(errMsg); Raven.captureException(error,{ extra: { errorMsg: errMsg } }); return Observable.of({ Errors: { General: 'No internet connection.' } }); }; // the request let request$= (options) => { return this.http.request(new Request(options)) .retrywhen(error => error.delay(1000)) .timeout(10000,new Error('timeout')) .map((res: Response) => res.json()) .catch(genericError$); }; // get the token and build request return token$ .map(jwt => { if (options.body) { if (typeof options.body !== 'string') { options.body = JSON.stringify(options.body); } options.body = options.body.replace(/ /g,'').replace(/\r?\n|\r/g,''); } options.headers = new Headers({ 'Content-Type': 'application/x-www-form-urlencoded,application/json' }); if (jwt.Token) { options.headers.append('Authorization',`Bearer ${jwt.Token}`); } Raven.captureMessage('request options',{ level: 'info',environment: 'live',extra: options }); return options; }) .switchMap(options => request$(options)); } }
我在用:
> Ionic 2.0.0-beta.11
> Angular 2.0.0-rc.4
>来自github的最新版本的NativeStorage插件
有错误的设备(只有两个例子,还有更多):
>三星SM-N910F(Webview:Chrome Mobile 53.0.2785,Android 6.0.1)
>三星SM-G800F(Webview:Chrome Mobile 53.0.2785,Android 5.1.1)
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。