首页 文章

Angular2获取url查询参数

提问于
浏览
25

我正在为我的Angular2网络应用程序设置Facebook注册 . 一旦应用程序通过Facebook接受(在重定向到Facebook授权页面后),它将重定向到我的webapp,其令牌和代码为url params:

http://localhost:55976/?#access_token=MY_ACCESS_TOKEN&code=MY_CODE

但是一旦页面加载,params就被删除了 . 网址变为:

http://localhost:55976/

如何在删除参数(access_token和代码)之前将其提取出来?我的路由配置包含:

{ path: 'login', component: LoginComponent },
{ path: 'login/:access_token/:code', component: LoginComponent },

EDIT:

以下是我在login.component中重定向到facebook的方式:html:

<a class="btn btn-social btn-facebook socialaccount_provider facebook" title="Facebook" href="#" (click)="login_facebook()">
    <span class="fa fa-facebook"></span> <span style="padding-left:25px">Sign in with Facebook</span>
</a>

打字稿:

login_facebook() {
    let url = 'https://www.facebook.com/dialog/oauth?'+
        'client_id=my_client_id' +
        '&redirect_uri=' + encodeURIComponent('http://localhost:55976/#/login/') +
        '&response_type=code%20token';
    console.log(url);
    window.location.href = url;
}

facebook api重定向到http://localhost:55976/#/login/,这是我尝试获取access_token和代码参数的地方 .

EDIT 2:

如果我删除重定向网址中的锐利,facebook会将我重定向到好的网址,但没有锐利,有角度无法解析网址 .

在删除'#'之前:

redirect_uri: http://localhost:55976/#/login/
facebook return: http://localhost:55976/?#access_token=MY_ACCESS_TOKEN&code=MY_CODE

删除'#'后:

redirect_uri: http://localhost:55976/login/
facebook return: http://localhost:55976/login/?#access_token=MY_ACCESS_TOKEN&code=MY_CODE

这意味着问题来自尖锐的问题 . 但没有尖锐,角度返回HTTP错误404.0 - 未找到 .

7 回答

  • 15

    您正在寻找 ActivatedRoutequery parameters .

    要接收它们,您可以将它们放入组件的 OnInit 函数中,如下所示:

    private accesstoken;
    private code;
    
    constructor(private route: ActivatedRoute) { }
    
    ngOnInit() {
      // Capture the access token and code
      this.route
          .queryParams
          .subscribe(params => {
              this.accesstoken = params['#access_token'];
              this.code = params['code'];
          });
    
      // do something with this.code and this.accesstoken
    }
    

    我在上面的链接中有更多的例子 . 您可能遇到角度问题,因为路由器还识别了以#开头的片段...如果angular确实将其识别为片段,那么您可以从 ActivatedRoute 订阅可观察的片段并按此方式执行 .

    我被重定向了 . 如果你是,可以考虑使用 preserveQueryParams 导航选项,类似这样 .

    this.router.navigate([redirect], {preserveQueryParams: true});
    
  • 28

    这是我最后的工作代码:

    进口:

    import { Router, NavigationCancel } from '@angular/router';
    import { URLSearchParams, } from '@angular/http';
    

    构造函数:

    constructor(public router: Router) {
        router.events.subscribe(s => {
          if (s instanceof NavigationCancel) {
            let params = new URLSearchParams(s.url.split('#')[1]);
            let access_token = params.get('access_token');
            let code = params.get('code');
          }
        });
      }
    
  • 0

    使用Javascript:

    (new URL(location)).searchParams.get("parameter_name")
    
  • 4
    getQueryParams( locationSearch: string):any {
        let params = {};
        if( locationSearch ) {
            locationSearch = locationSearch.split('?')[1];
            let splited = locationSearch.split('&');
            for( let i = 0; i < splited.length; i++ ) {
                let propName = splited[i].split('=')[0];
                let propValue = splited[i].split('=')[1];
                params[propName] = propValue;
            }
        }
    
        return params;
    }
    
    let q = getQueryParams( location.search );
    
  • 1

    这适合我! :)

    import { ActivatedRoute } from '@angular/router'; 
    
    constructor(private route: ActivatedRoute) { }
    
    /** usage in the method */
    let projectId = this.route.snapshot.queryParams.projectId;
    
  • -1

    this帖子中查看我的答案 .

    [更新]似乎有些主持人删除了我的答案,说这是重复的答案 . 但我不同意,因为我根据每个问题发布了相关的代码片段 . 在此答案未被删除之前,我再次在此处发布部分答案 . 如果您同意,请投票取消删除我的答案 .


    使用 window.location.hash 访问从#开始的所有参数 . 或者您可以使用 window.location.href 访问完整的URL . 要获得令牌,您可以使用 window.location.hash.match(/#access_token=([^&]+)/)[1] .

    注意:如果您使用的是TypeScript,则需要在组件中导入窗口 .

    declare let window;
    

  • 2

    你试过这个吗?

    import { Params, Router } from '@angular/router';
    
    
         constructor(private router: Router) {
    
                this.route.params.forEach((params: Params) => {
                //here you can get your params
                let param = params['parameterName'];
    
    
                })
            }
    

相关问题