【问题标题】:Including variables in URL, returns error page在 URL 中包含变量,返回错误页面
【发布时间】:2014-04-13 20:27:14
【问题描述】:

我正在尝试使用 HTMLUnit 访问 java 中的 URL。我使用的网站的工作方式是,对于网站上的搜索结果,它最初绘制搜索结果的第一页,然后更改为选定的页面。我想要做的是访问特定页面,例如 21。URL 必须附加一个变量(例如http://www.thomsonlocal.com/Electricians/UK/#||25)。在我的浏览器上使用它会在最初加载第一页后获得第 25 页,然后启动一个方法。(javascript 或 JQuery?)

我尝试对 URL 进行编码以转义竖线字符,但这会在网站上返回错误页面。

page = webClient.getPage("http://www.thomsonlocal.com/Electricians/UK/"+URLEncoder.encode("#||" , "UTF-8")+ 21);

我的问题是我在这里做错了什么?有没有办法找出 URL 中的变量传递给的方法是什么?

【问题讨论】:

    标签: java javascript html htmlunit


    【解决方案1】:

    # 之后的部分是一个 URI 片段。它不遵守与 URLEncoder.encode() 所做的表单数据相同的转义规则(这意味着它不适用于 URL,这与流行的看法相反)。

    您需要的是此处的 URI 模板 (RFC 6570)。示例使用this library:

    public static void main(final String... args)
        throws URITemplateException, MalformedURLException
    {
        final URITemplate template 
            = new URITemplate("http://www.thomsonlocal.com/Electricians/UK/#{+var}");
    
        final VariableMap map = VariableMap.newBuilder()
            .addScalarValue("var", "||25")
            .freeze();
    
        System.out.println(template.toURL(map));
    }
    

    这将(正确)打印:

    http://www.thomsonlocal.com/Electricians/UK/#%7C%7C25
    

    另一种解决方案,虽然不那么灵活,但使用 URI 构造函数:

    final URI uri = new URI("http", "www.thomsonlocal.com",
        "/Electricians/UK/", "||25");
    
    System.out.println(uri.toURL());
    

    这也将打印正确的结果。

    【讨论】:

      猜你喜欢
      • 2021-05-20
      • 2012-09-11
      • 2015-10-24
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多