android - Angular2 自定义请求

标签 android cordova angular httprequest ionic2

我正在使用自定义 HTTP 请求类来为我的所有请求添加授权 header ,这在几乎所有 Android 设备上都可以正常工作。现在有线的事情是,我收到一些客户投诉,尽管他们有一个可用的网络连接(其他应用程序工作并且错误也被传输到哨兵服务器),但他们收到“无互联网连接”错误。 当我使用 Sentry 错误跟踪时,我发现这些客户都收到了错误,因为在应用程序启动时的第一个请求 10 秒后会抛出超时错误。 我猜这个请求一定有问题,所以我为有限数量的用户构建了一个 alpha 版本来追踪错误(我将每个请求的选项发送给 Sentry),但请求看起来很好。 接下来的猜测是这些设备上的 cordova-plugin-nativestorage 出了点问题,但当我发现它们时,它至少应该返回一个空 token 。现在不知道如何修复它。任何建议表示赞赏!

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 插件

出现错误的设备(只有两个例子,还有更多):

  • Samsung SM-N910F(Webview:Chrome Mobile 53.0.2785,Android 6.0.1)
  • Samsung SM-G800F(Webview:Chrome Mobile 53.0.2785,Android 5.1.1)

最佳答案

如果有人感兴趣:根本原因是升级 Android 的人不知何故丢失了 chrome webview 应用程序,而 Angular 没有它就无法工作(当然)。我通过在我的应用程序中打包 crosswalk-webview 解决了这个问题!

关于android - Angular2 自定义请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41283830/

相关文章:

java - 如何在 Android 上将相机方向锁定为纵向

android - 邀请多人游戏时发送通知(游戏服务)

javascript - 在后台运行phonegap ios应用程序中的JavaScript函数。

android - 找不到support-core-ui.aar Ionic 3构建错误

angular - Angular 的 "unidirectional data flow rule"是什么?

javascript - Angular 2 ngFor 中每个项目的函数调用返回值

android - 如何在Retrofit2中发送可选参数?

android - 小部件中的 EditText 替代品?必须有办法

android - 在 Ionic 框架中使用 Genymotion 模拟器

angular - 是否建议订阅管道内的商店(ngRx)?