其他分享
首页 > 其他分享> > CodeGo.net>如何在路径段中包括数字(哈希)字符#?

CodeGo.net>如何在路径段中包括数字(哈希)字符#?

作者:互联网

我必须下载一个文件(使用现有的Flurl-Http端点[1]),该文件的名称包含一个“#”,当然必须转义为“#”才能与uri碎片检测不冲突.

但是Flurl总是转义其余字符,而不是此字符,导致uri无法正常工作,其中一半路径和所有查询参数都丢失了,因为它们被解析为uri片段:

Url url = "http://server/api";
url.AppendPathSegment("item #123.txt");
Console.WriteLine(url.ToString());

返回:http:// server / api / item#123.txt

这意味着一个HTTP请求(使用Flurl.Http)将仅尝试下载不存在的资源http:// server / api / item.

即使我预先转义了片段,结果仍然变得完全相同:

url.AppendPathSegment("item %23123.txt");
Console.WriteLine(url.ToString());

再次返回:http:// server / api / item#123.txt.

有什么办法可以阻止这种“魔术”的发生?

[1]这意味着我有委托/接口,其中输入是我必须修改的现有Flurl.Url实例.

解决方法:

您好像发现了一个错误.这是Flurl遵循的documented编码规则:

  • Query string values are fully URL-encoded.
  • For path segments, reserved characters such as / and % are not encoded.
  • For path segments, illegal characters such as spaces are encoded.
  • For path segments, the ? character is encoded, since query strings get special treatment.

根据第二点,它不应在路径中编码#,因此它如何处理AppendPathSegment(“ item#123.txt”)是正确的.但是,当您自己将#编码为#时,Flurl当然不应对其进行取消编码.但我已经确认这是事实.我邀请您参加create an issue on GitHub,并且将解决该问题.

同时,您可以编写自己的扩展方法来解决这种情况.像这样的东西应该可以工作(并且您甚至不需要预先编码#):

public static Url AppendFileName(this Url url, string fileName) {
    url.Path += "/" + WebUtility.UrlEncode(fileName);
    return url;
}

标签:flurl,c,net
来源: https://codeday.me/bug/20191111/2017517.html