我的Java独立应用程序从用户获取一个URL(指向一个文件),我需要点击它并下载它.我面临的问题是我无法正确编码HTTP URL地址......
例:
URL: http://search.barnesandnoble.com/booksearch/first book.pdf
java.net.URLEncoder.encode(url.toString(), "ISO-8859-1");
Run Code Online (Sandbox Code Playgroud)
回报我:
http%3A%2F%2Fsearch.barnesandnoble.com%2Fbooksearch%2Ffirst+book.pdf
Run Code Online (Sandbox Code Playgroud)
但是,我想要的是
http://search.barnesandnoble.com/booksearch/first%20book.pdf
Run Code Online (Sandbox Code Playgroud)
(空间由%20取代)
我猜URLEncoder不是为了编码HTTP URL而设计的... JavaDoc说"用于HTML表单编码的实用程序类"......有没有其他方法可以做到这一点?
我想发送一个URI作为查询/矩阵参数的值.在我将它附加到现有URI之前,我需要根据RFC 2396对其进行编码.例如,给定输入:
http://google.com/resource?key=value1 & value2
我期待输出:
http%3a%2f%2fgoogle.com%2fresource%3fkey%3dvalue1%2520%26%2520value2
既java.net.URLEncoder不会也java.net.URI不会产生正确的输出.URLEncoder用于HTML格式编码,与RFC 2396不同.URI没有一次编码单个值的机制,因此无法知道value1和value2是同一个键的一部分.
首先,一些快速背景...作为与第三方供应商集成的一部分,我有一个C#.Net Web应用程序,它接收查询字符串中包含大量信息的URL.该URL使用MD5哈希和共享密钥进行签名.基本上,我拉入查询字符串,删除它们的哈希,在剩余的查询字符串上执行我自己的哈希,并确保我匹配所提供的哈希.
我正在以下列方式检索Uri ......
Uri uriFromVendor = new Uri(Request.Url.ToString());
string queryFromVendor = uriFromVendor.Query.Substring(1); //Substring to remove question mark
Run Code Online (Sandbox Code Playgroud)
我的问题源于查询字符串,其中包含特殊字符,如变音符号(ü).供应商正在根据RFC 2396表示计算其哈希值%FC.我的C#.Net应用程序正在根据RFC 3986表示计算它的哈希值%C3%BC.不用说,我们的哈希不匹配,我抛出我的错误.
奇怪的是,.Net中Uri类的文档说它应该遵循RFC 2396,除非另有设置为RFC 3986,但我没有在我的web.config文件中有他们说这个行为需要的条目.
如何强制Uri构造函数使用RFC 2396约定?
如果失败了,有没有一种简单的方法将RFC 3986八位字节对转换为RFC 2396八位字节?