HttpURLConnection的URL编码

时间:2019-04-11 06:21:32

标签: java android

我写了一个代码来从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正常工作。

2 个答案:

答案 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可能包含的字符非常受限制。唯一安全的字符是:

  • A–Z
  • a–z
  • 0–9
  • _。 〜

如果对其他字符进行了编码,例如如果将(编码为%28,则可以将其包括在内。

某些字符必须根据目的进行编码,尤其是?&=。如果用于提供查询参数,则不能编码。如果它们是查询值的一部分,则必须对其进行编码。

因此在构造查询部分之前必须进行编码:

  • 使用URLEncoder.encode(queryValue)分别编码每个查询值。
  • 然后连接查询部分:query = "expand=" + encodedExpandValue + "&filter=" + encodedFilterValue
  • 然后创建整个URL。

/字符非常有问题,无论它是否显示为已编码。某些Web服务器将始终将其视为路径分隔符。最好在查询部分避免它。