作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我无法使用 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 中的问题
RequestOptionsArgs
应该有一个字段 withCredentials
但我在 IDE Visual Studio Code 中收到一个错误,说它不存在于界面;ionic 可能使用的是较旧的 angular 2 版本?)我做了更多的搜索,并且能够理解如何插入 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/
我是一名优秀的程序员,十分优秀!