【问题标题】:How do I prevent slashes in URLs from being encoded?如何防止 URL 中的斜杠被编码?
【发布时间】:2017-01-10 21:40:27
【问题描述】:

我正在使用angular 2.0,特别是routing 功能来解决这个问题。我设置路由的方式如下所示。

const routes: Routes = [
    { path : ':filePath', component: ParentDisplayComponent,
        children : [
            { path : 'metadata', component: MetadataDisplayComponent },
            { path : 'data', component : DataDisplayComponent } 
        ]
    }
];

如您所见,我的网址可能最终看起来像这样。

<host>:<port>/#/<file path>/metadata

但是,因为我正在制作一个文件浏览器,所以我的“文件路径”(初始参数)看起来像这样。

/foo/bar/baz

为了完成这项工作,我不得不避开斜线,所以现在我的网址最终看起来像这样

<host>:<port>/#/%252ffoo%252fbar%252fbaz/metadata

我知道这或多或少“很好”,但我非常讨厌它的外观,而且就手动输入网址而言,它对用户不是很友好。有人对如何使我的网址更加用户友好有任何建议吗?我确实需要一个父级组件来跟踪所选文件,这就是为什么我没有做这样的事情。

<host>:<port>/#/metadata?path=/foo/bar/baz

这样做的原因是我希望我的应用程序始终在屏幕左侧有一个“浏览器”(类似于 Windows 资源管理器),在屏幕中间有一个可交换组件。想象一下这样的东西。

 ___________________________
|___________________________|
|       |
|file a |  ____________________
|file b |  |swappable component|
|file c |  ---------------------
|etc... | 

这大概就够啰嗦了。考虑到我必须有包含斜杠的参数,有没有人有任何想法让我的网址更好?

【问题讨论】:

标签: angular url routing escaping urlencode


【解决方案1】:

Angular2 默认使用 encodeURIComponent() 对 URL 中的 queryParams 进行编码,您可以通过编写自定义 URL 序列化程序并覆盖默认功能来避免它。

在我的例子中,我想避免使用 Angular2 来避免用 (%2) 替换逗号(,)。我将 Query 作为 lang=en-us,en-uk 传递,它被转换为 lang=en-us%2en-uk。

我是这样解决的:

CustomUrlSerializer.ts

import {UrlSerializer, UrlTree, DefaultUrlSerializer} from '@angular/router';

export class CustomUrlSerializer implements UrlSerializer {
    parse(url: any): UrlTree {
        let dus = new DefaultUrlSerializer();
        return dus.parse(url);
    }

    serialize(tree: UrlTree): any {
        let dus = new DefaultUrlSerializer(),
            path = dus.serialize(tree);
        // use your regex to replace as per your requirement.
        return path.replace(/%2/g,',');
    }
}

以下行添加到您的主 appModule.ts

import {UrlSerializer} from '@angular/router';
import {CustomUrlSerializer} from './CustomUrlSerializer';

@NgModule({
    providers: [{ provide: UrlSerializer, useClass: CustomUrlSerializer }]
})

这不会破坏您的默认功能并根据您的需要处理 URL。

【讨论】:

    【解决方案2】:

    您无法阻止对斜线进行编码。 我会使用看起来更干净的matrix parameters

    http://page.com/home/example;a=foo;b=bar;c=baz/something

    你可以使用Router的导航方法来使用它们

    this.router.navigate(['/home', '/example', { a: 'foo', b: 'bar', c: 'baz' }, '/something']);

    要获取当前参数,请使用您可以订阅的ActivatedRouteparams 属性。

    【讨论】:

    • 每个 foo、bar 和 baz 并不对应于一个可选参数,但是......相反......“/foo/bar/baz”指的是一个必需参数。
    • 这是唯一可以看起来干净的东西。 Angular 的路由器在您的情况下并不是完美的解决方案,创建自定义路由器应该可以帮助您解决问题。
    • 我正在试一试...像这样的 URL /metadata?path=/foo/bar/baz,从元数据组件中获取路径,从后端加载我需要的内容,然后将其广播给父级。如果我这样做,那么我需要确保每次更改组件时都不会重新抓取数据……仅当路径查询参数更改时……啊……我希望我们不使用斜杠我们的分隔符。那好吧。无论如何,谢谢!
    猜你喜欢
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2016-03-30
    • 2021-04-18
    • 2012-07-13
    • 2016-10-29
    • 1970-01-01
    相关资源
    最近更新 更多