javascript - 如何在 Ionic 中使用 CORS 编写 Angular 2 服务?

标签 javascript typescript angular ionic2 angular-http

我无法使用 http 将我的 Angular 1 JavaScript 服务移动到 Angular 2 TypeScript 服务以发出 CORS 请求(这是使用 Ionic 版本 2)。在 Angular 1 中,我会做这样的事情。

angular.module('app.services',[])
.factory('LoginService', ['$http', function($http) { 
 var service = {};

 service.isUserLoggedIn = function() {
  var restUrl = 'http://10.10.10.25:8080/api/user/isloggedin';
  var options = {
   method: 'GET', url: restUrl, withCredentials: true,
   headers: { 
    'x-request-with': 'XMLHttpRequest', 
    'x-access-token': 'sometoken' 
   }
  };
  return $http(options);
 };

 return service;
}])

在使用 TypeScript 的 Angular 2 中,发生了很多变化(Promises/Observables)。到目前为止,我的尝试如下所示。

import { Injectable } from '@angular/core';
import { Headers, Http, Response, RequestMethod, RequestOptionsArgs } from '@angular/http';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class LoginService {
  constructor(private _http:Http) {

  }

  isLoggedIn():boolean {
    var r:any;
    var e:any;
    let url = 'http://10.10.10.25:8080/api/user/isloggedin';
    let options:RequestOptionsArgs = {
      url: url,
      method: RequestMethod.Get,
      search: null,
      headers: new Headers({
        'Content-Type': 'application/json',
        'X-Requested-With': 'XMLHttpRequest',
        'x-access-token' : 'sometoken'
      }),
      body: null
    };
    this._http.get(url, options).map(this.extractData).catch(this.handleError)
      .subscribe(
       response => { r = <any>response; console.log(r); }, 
       error => { e = <any>error; console.log(e); });
    return false;
  }

  private extractData(response:Response) {
    let body = response.json();
    return body.data || { };
  }

  private handleError(error:any) {
    let errMsg = (error.message) ? error.message :
      error.status ? `${error.status} - ${error.statusText}` : 'Server error';
    console.log('error = ' + errMsg);
    return Observable.throw(errMsg);
  }
}

我不再确定如何在 Angular 2 中解决我在 Angular 1 中的问题

我做了更多的搜索,并且能够理解如何插入 header 和正确处理订阅。但是,withCredentials 仍然是个问题。

我找到了这篇 SO 帖子 angular2 xhrfields withcredentials true并按如下方式修改了我的构造函数。现在可以了。

constructor(@Inject(Http) private _http:Http) {
    let _build = (<any> _http)._backend._browserXHR.build;
    (<any> _http)._backend._browserXHR.build = () => {
      let _xhr = _build();
      _xhr.withCredentails = true;
      return _xhr;
    }
  }

最佳答案

withCredentails 的支持将出现在即将发布的 Angular2 的 RC2 版本中。它不是 RC1 版本的一部分...您需要稍等一下。

使用 RC2,您将能够直接在请求选项中使用此属性:

this.get('...', { withCredentials: true })

有关详细信息,请参阅此问题:

关于javascript - 如何在 Ionic 中使用 CORS 编写 Angular 2 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37824994/

相关文章:

angular - 找不到名称 'PropertyKey'

angular - 使用 Marbles 对外部 URL 进行单元测试 NGRX 效果

angular - 自定义 Angular Material 2 工具提示样式

javascript - 不明白为什么不应在语句开头使用对象文字

javascript - div 相对于静态元素的绝对位置

javascript - 使用其子模型初始化 Backbone 模型

html - React - 如何修改 root 中的 html?

php - 重构 JavaScript 和 PHP 代码 [求职面试]

typescript - 在 &lt;script setup> 中出现不当警告时如何正确配置 ESLint?

typescript - ko.映射 ||无法读取未定义的属性 'fromJS'