我有一个网址,想从中解析并提取参数。我的实现基于以下 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/