java - URLEncodedUtils 不会解析给定 url 中的所有获取参数

标签 java httpclient

我有一个网址,想从中解析并提取参数。我的实现基于以下 stackoverflow post

但是我的网址比上面帖子中使用的网址更复杂。它看起来像这样:

https://example.com/cdscontent/login?initialURI=https%3A%2F%2Fexample.com%2Fdashboard%2F%3Fportal%3Dmyportal%26LO%3D4%26contentid%3D10007.786471%26viewmode%3Dcontent%26variant%3D%2Fmyportal%2F

如您所见,它具有参数 initialURI,它是(编码的)url 本身,并且其中参数的顺序无法更改。

当我运行org.apache.http.client.utils.URLEncodedUtils#parse时,它返回

[initialURI=https://example.com/dashboard/?portal=myportal, LO=4, contentid=10007.786471, viewmode=content, variant=/myportal/]

如您所见,它解析除 portal 之外的每个参数。它仍然绑定(bind)到 https://example.com/dashboard/ 换句话说,我期待这个:

[initialURI=https://example.com/dashboard/, portal=myportal, LO=4, contentid=10007.786471, viewmode=content, variant=/myportal/]

我在这里做错了什么,还是您认为 URLEncodedUtils#parse 无法处理这种情况?

您有其他建议吗?

非常感谢!

尝试进行单元测试

public class UrlParserTest {

  @Test
  public void testParseUrl() throws UnsupportedEncodingException, URISyntaxException {

    String url =
        "https://www.example.com/cdscontent/login?initialURI=https%3A%2F%2Fwww.example.com%2Fdashboard%2F%3Fportal%3Dmyportal%26LO%3D4%26contentid%3D10007.786471%26viewmode%3Dcontent%26variant%3D%2Fmyportal%2F";

    String decoded = URLDecoder.decode(url, "UTF-8");
    List<NameValuePair> params = URLEncodedUtils.parse(new URI(decoded), "UTF-8");
    System.out.println(params);
  }

}

最佳答案

我们在做什么

您有以下网址(已解码):

https://www.example.com/cdscontent/login?initialURI=https://www.example.com/dashboard/?portal=myportal&LO=4&contentid=10007.786471&viewmode=content&variant=/myportal/

此网址由主网址组成:

https://www.example.com/cdscontent/login

有 1 个查询参数initialURI:

https://www.example.com/dashboard/?portal=myportal&LO=4&contentid=10007.786471&viewmode=content&variant=/myportal/

此网址有多个查询参数(您要查找的参数):

portal=myportal&LO=4&contentid=10007.786471&viewmode=content&variant=/myportal/

解决方案

第 1 步:

我们首先必须获取查询参数initialURI中的url:

 List<NameValuePair> params = URLEncodedUtils.parse(new URI(url), Charset.forName("UTF-8"));

// Find first NameValuePair where the name equals initialURI
Optional<NameValuePair> initialURI = params.stream()
        .filter(e -> e.getName().equals("initialURI"))
        .findFirst();

System.out.println(initialURI);

打印:

Optional[initialURI=https://www.example.com/dashboard/?portal=myportal&LO=4&contentid=10007.786471&viewmode=content&variant=/myportal/]

第 2 步:

现在我们可以获取该url的查询参数并打印它们:

List<NameValuePair> initialParams = URLEncodedUtils
        .parse(new URI(initialURI.get().getValue()), Charset.forName("UTF-8"));

System.out.println(initialParams);

这会导致:

[portal=myportal, LO=4, contentid=10007.786471, viewmode=content, variant=/myportal/]

注意

这并不完全是您预期的行为,您希望 initialURI=https://example.com/dashboard/ 也出现在列表中。但是您可以看到,这不是查询参数,initialURI 中的整个 url(及其查询参数)都是查询参数。

关于java - URLEncodedUtils 不会解析给定 url 中的所有获取参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53848115/

相关文章:

httpclient - zuul 代理缓慢 - RibbonLoadBalancingHttpClient

Java HttpClient 使用智能卡进行身份验证

java - 结果集验证

java - pom.xml 和事务中包含 spring-boot-starter-data-jpa 和 spring-tx 的旧版 spring boot 项目?

c# - 在 UWP(W10) 中使用 HttpClient 发出 POST 请求

c# - HttpClient 错误太多请求速率限制

java - Applet + Http Get 向其他 URL 发出请求

java - 无法访问数组java中的对象

java - 如何从 AlertDialog onClickListener 中访问我的 Activity 实例变量?

java - MongoDB Java 客户端自动故障转移失败