java - 编码发送到服务器的 URL(不在查询中)

标签 java apache

我需要每天为几个 URL 测试我的服务器,因为这些 URL 由我的用户更新 - 这将在 Java 中完成。但是,这些 URL 包含奇怪的字符(如德语变音符号)。基本上我正在做的是:

for every URL in the list to check
  URL u = new URL(the_url);
  u.openConnection(..);
  // read the content and handle it

现在,我发现 org.apache.commons.codec.net.URLCodec 可以很好地编码字符串以粘贴到 QueryString 中,而不适合将奇怪的 URL 编码到它们的十六进制对应物。以下是 URL 的一些示例:

  • http://www.example com/u/überraum-03/
  • http://www.example com/u/são-paulo-dude/
  • http://www.example com/u/håkon-hellström/

第一个期望的结果是;

  • http://www.example com/u/%c3%9berraum-03/

Apache Commons 或 java 本身是否有任何库来转换 ACTUAL url 中的特殊字符(不是查询字符串 - 因此不会替换相同类型的字符)?

感谢您的宝贵时间。

已编辑 Firefox 翻译“yr.no/place/Norway/Nordland/Moskenes/Å/data.html”;进入“yr.no/place/Norway/Nordland/Moskenes/%C3%85/data.html”(通过输入第一个 URL 进行尝试,按回车键,然后将 URL 复制到文档中)。我正在寻找的正是这种效果——因为这是实际的翻译。最有可能发生的情况是 FF 知道 Å 是坏事,它尝试多个版本或者它接受服务器的“Location” header ;无论哪种方式 - 仅在 URL 的一个子集上存在从“Å”到“%C3%85”的转换。这就是我们需要的功能。

已编辑 我刚刚验证了评论者给出的代码无法正常工作。例如,试试这个:

try{
        String urlStr = "http://www.yr.no/place/Norway/Nordland/Moskenes/Å/data.html";
        URL u=new URL(urlStr);
        URI uri = new URI(u.getProtocol(),
                    u.getUserInfo(), u.getHost(), u.getPort(),
                    u.getPath(), u.getQuery(),
                    null); // removing ref

        URL urlObj = uri.toURL();
        HttpURLConnection connection = (HttpURLConnection) urlObj.openConnection();
        connection.setInstanceFollowRedirects(false);
        connection.connect();

        for (int i=0;i<connection.getHeaderFields().size();i++)
            System.out.println(connection.getHeaderFieldKey(i)+": "+connection.getHeaderField(i));
        System.exit(0);
    }catch(Exception e){e.printStackTrace();};

将产生 404 错误 - 奇怪的是编码部分也不起作用。

最佳答案

如果您需要一个有效 URI(符合 RFC 2396 标准)的 URL,您可以用 Java 创建一个这样的 URL

    String urlString = "http://www.example.com/u/håkon-hellström/";

    URL url = new URL(urlString);
    URI uri = new URI(url.getProtocol(),url.getAuthority(), url.getPath(), url.getQuery(), url.getRef());
    url = new URL(uri.toASCIIString());

也就是说,您提供的所有三个示例字符串都符合 RFC 2396 标准,不需要编码。我假设您提供的 URL 的权限部分中的空格是拼写错误。

编辑:

我更新了上面的代码块。通过使用 URI.toASCIIString()您可以将生成的 URI 限制为仅 US-ASCII 字符(其他字符已编码)。然后,生成的字符串可用于创建新的有效 URL。

http://www.example.com/u/håkon-hellström/

更改为

http://www.example.com/u/h%C3%A5kon-hellstr%C3%B6m/

关于java - 编码发送到服务器的 URL(不在查询中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9038101/

相关文章:

java - 获取所有可能的可用货币

java - HashMap 作为字符串的 ArrayList

java - 如何在opencv Java中将int[][]转换为Mat?

java - Apache POI——将数据插入特定列/行和工作表 EXCEL w/Java

node.js - Cesium map 可以运行在 Apache HTTP 服务器而不是 node.js 环境吗?

java - 带有表格布局的Android中的水平和垂直滚动条?

java - CDI : @alternative vs @Qualifiers

html - 随机文章按钮

apache - 我如何在 Apache 的 mod_proxy 后面使用密码保护应用程序?

apache - Mod重写隐藏文件夹