http - Ionic 2 - 从存储值中获取 token 并在 HTTP 请求之前设置 header

标签 http angular ionic2 web-sql

我正在使用 ionic/storage用于存储 api_token 的包对于登录后的用户,这样我就可以使用唯一 token 与 API 进行交互。

我面临的问题是我需要通过 storage.get 获取值它返回一个 promise 并导致我想设置的 header 没有及时设置。

我需要返回 RequestOptions 的一个实例,但不知道如何添加我从 promise 中检索到的 header 。添加与 localStorage 同步的 header 在测试时工作正常,因此问题一定是异步执行。

createAuthorizationHeader(headers: Headers) {
    // this does add the header in time
    localStorage.setItem('api_token', 'some token');
    headers.append('Authorization', 'Bearer ' + localStorage.getItem('api_token'));

    // this does not add the header in time
    return this.storage.get('api_token').then((value) => {
        headers.append('Authorization', 'Bearer ' + value);
    });
}

getHeaders(path): RequestOptions {
    let headers = new Headers({
        'Accept': 'application/json',
        'Content-Type': 'application/json'
    });

    if(!this.isGuestRoute(path)) {
        this.createAuthorizationHeader(headers);
    }

    return new RequestOptions({ headers: headers });
}

get(path: string) {
    return this._http.get(this.actionUrl + path, this.getHeaders(path))
        .map(res => res.json())
        .catch(this.handleError);
}

编辑:工作代码现在看起来像这样

getApiToken(): Observable<Headers> {
    return Observable.fromPromise(this.storage.get('api_token'));
}

getHeaders(): Headers {
    return new Headers({
        'Accept': 'application/json',
        'Content-Type': 'application/json'
    });
}

get(path: string) {
    let headers: Headers = this.getHeaders();

    if(!this.isGuestRoute(path)) {
        return this.getApiToken().flatMap(data => {
            headers.append('Authorization', 'Bearer' + data);

            return this._http.get(this.actionUrl + path, { headers : headers })
                .map(res =>  res.json())
                .catch(this.handleError);
        });
    }

    return this._http.get(this.actionUrl + path, { headers : headers })
        .map(res => res.json())
        .catch(this.handleError);
}

最佳答案

查看我的类似问题Angular2 - Use value of Observable returning method in another Observable

如果您将 Promise 转换为 Observable,您将能够使用 rxjs flatMap 函数。

让我给你看看你当时的样子

getApiToken(): Observable<Headers> {
    return Observable.fromPromise(this.storage.get('api_token'));
   //OR return Observalbe.of(this.storage.get('api_token'));
}

getHeaders(): Headers { 
     //create all headers here except the 'api_token'
     .....
}


get(path: string): Observable<any> {
    let headers: Headers = this.getHeaders();
    return this.getApiToken().flatMap(data => {

       headers.append('Authorization', 'Bearer'+data);

       return this.http.get(this.actionUrl + path, headers)
          .map(res =>  res.json()) 
          .catch(this.handleError);
    });
}

或者(刚刚了解到这个所以不确定它是否有效)

createAuthorizationHeader(headers: Headers) {
    // this does add the header in time
    localStorage.setItem('api_token', 'some token');
    headers.append('Authorization', 'Bearer ' + localStorage.getItem('api_token'));

    // this does not add the header in time
    let api_token = await this.storage.get('api_token');
    headers.append('Authorization', 'Bearer ' + api_token);
}

关于http - Ionic 2 - 从存储值中获取 token 并在 HTTP 请求之前设置 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41035225/

相关文章:

angular - 从rest api打印JSON对象的第一个字符 - Angular 2

angular - Ionic 2 auth - 如果本地存储上有用户,则跳过登录页面

angular - 使用 Angular 通过 HTTP 发送 SOAP 请求?

api - URL 查询参数或媒体类型参数(在 Accept header 中)来配置对 HTTP 请求的响应?

json - Symfony2 - 检查接受 HTTP header 是否支持 "application/json"

javascript - 简单请求中的 Cors 错误 : Request header field Authorization is not allowed by Access-Control-Allow-Headers in preflight response

css - 将 bootstrap.scss 导入 styles.scss 比添加到 .angular.cli.json 中的样式 block 有什么优势?

angular-cli 在使用 AOT 时不按顺序捆绑样式文件

android - ionic 2 - 播放 mp3 文件

http - nginx 和带有代理传递的尾部斜线