我写了一个代码来从API调用中获取值...它可以正常使用URL,但是当我对URL进行编码后再进行调用就意味着它不起作用...它给出了状态错误404 >
URL url = new URL(params[0]);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
url = uri.toURL();
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.setRequestProperty("Content-Type", "application/json");
urlConnection.setRequestMethod("GET");
原始网址
https://staging.xyz.com/odata/Venues?$expand=Fixtures($filter=day(DateTime) eq 1 and month(DateTime) eq 12 and year(DateTime) eq 2018)&$filter=Fixtures/any(f: day(f/DateTime) eq 1 and month(f/DateTime) eq 12 and year(f/DateTime) eq 2018)
编码网址
http://staging.xyz.com/odata/Venues?$expand=Fixtures($filter=day(DateTime)%20eq%201%20and%20month(DateTime)%20eq%2012%20and%20year(DateTime)%20eq%202018)&$filter=Fixtures/any(f:%20day(f/DateTime)%20eq%201%20and%20month(f/DateTime)%20eq%2012%20and%20year(f/DateTime)%20eq%202018)
是否有办法使编码的URL正常工作。
答案 0 :(得分:0)
您可以使用URLEncoder.encode(YOUR_URL)
对String URL单个查询(以'&'分隔)进行编码,然后将它们组合在一起。
或者,如果您可以分别使用查询参数的键和值,则可以使用Uri.parse
对整个URL进行编码,例如:
String uri = Uri.parse("http://...") //the "root" url without any query parameters
.buildUpon()
.appendQueryParameter("key", "val")
.build().toString();
答案 1 :(得分:0)
URL可能包含的字符非常受限制。唯一安全的字符是:
如果对其他字符进行了编码,例如如果将(
编码为%28
,则可以将其包括在内。
某些字符必须根据目的进行编码,尤其是?
,&
和=
。如果用于提供查询参数,则不能编码。如果它们是查询值的一部分,则必须对其进行编码。
因此在构造查询部分之前必须进行编码:
URLEncoder.encode(queryValue)
分别编码每个查询值。query = "expand=" + encodedExpandValue + "&filter=" + encodedFilterValue
。 /
字符非常有问题,无论它是否显示为已编码。某些Web服务器将始终将其视为路径分隔符。最好在查询部分避免它。