我试图使用Spring的UriComponentsBuilder生成一些用于OAuth交互的URL。查询参数包括回调URL和带有空格的参数值等实体。
由于UriUtils现在已过时,因此尝试使用UriComponentBuilder。
UriComponentsBuilder urlBuilder = UriComponentsBuilder.fromHttpUrl(oauthURL);
urlBuilder.queryParam("client_id", clientId);
urlBuilder.queryParam("redirect_uri", redirectURI);
urlBuilder.queryParam("scope", "test1 test2");
String url = urlBuilder.build(false).encode().toUriString();
很不幸,尽管作用域参数中的空格被成功替换为 '+',但 redirect_uri 参数根本没有进行 URL 编码。
例如,
redirect_uri=https://oauth2-login-demo.appspot.com/code
本应该结束
redirect_uri=https%3A%2F%2Foauth2-login-demo.appspot.com%2Fcode
但没有被触及。深入代码,具体地说是 org.springframework.web.util.HierarchicalUriComponents.Type.QUERY_PARAM.isAllowed(c) :
if ('=' == c || '+' == c || '&' == c) {
return false;
}
else {
return isPchar(c) || '/' == c || '?' == c;
}
明显允许':'和'/'字符,但它不应该这样。虽然我想象不出来它在做什么其他类型的编码,但它一定在做某些事情。我在这里找错了吗?
谢谢
&
和其他有意义的字符也没有被转义。 UriComponentsBuilder没有对查询参数进行URL编码。 - Adam MillerchipUriComponentsBuilder urlBuilder = UriComponentsBuilder.fromHttpUrl("http://example.org"); urlBuilder.queryParam("scope", "test1&test2=test3+test4"); String url = urlBuilder.build(false).encode().toUriString(); System.out.println(url);
结果:http://example.org?scope=test1%26test2%3Dtest3+test4
- simonhimport requests response = requests.get('http://example.org') print(response.content)
这段代码使用Python的requests库向example.org
发送GET请求,并打印响应内容。 - simonh