微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – Angular2自定义请求

我正在使用自定义HTTP请求类为我的所有请求添加授权标头,这几乎适用于所有 Android设备.现在有线的事情是,我得到了一些客户投诉他们正在获得“无互联网连接”错误,尽管他们有一个有效的网络连接(其他应用程序工作,错误也传输到Sentry服务器).
当我使用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)

解决方法

如果有人感兴趣:根本原因是那些升级Android的人以某种方式丢失了chrome webview应用程序而且Angular在没有一个(当然)没有工作.我通过在我的应用程序中打包crosswalk-webview解决了它!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐