2014-12-04 42 views
1

我需要处理传递给我们库的任何给定的url。所以刚开始我做:为什么我需要url encode =?

 URL url = new URL(filename); 
     URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); 
     url = new URL(uri.toASCIIString()); 
     URLConnection conn = url.openConnection(); 

的URL http://www.stackoverflow.com?title =Člen8FO这给我的http://www.stackoverflow.com?title=%C4%8Clen8FO

一个URL和返回的403,当我提出的要求。于是我做了:

 URL url = new URL(filename); 
     URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), URLEncoder.encode(url.getQuery(), "UTF-8"), url.getRef()); 
     url = new URL(uri.toASCIIString()); 

这给了我的http://www.stackoverflow.com?title%3D%C4%8Clen8FO

一个url它为什么失败的一个明确=?我认为这完全有效。

更新:这太奇怪了。下面的代码失败之前,现在它成功了。

import java.io.InputStream; 
import java.net.*; 

public class UriIssue { 

    public static void main(String[] args) { 

     try { 
      openUriWithEncode("http://www.google.com/?q=\u010clen8FO"); 
      System.out.println("completed successfully"); 
     } catch (Exception ex) { 
      System.out.println("exception = " + ex); 
     } 

     try { 
      openUriNoEncode("http://www.google.com/?q=\u010clen8FO"); 
      System.out.println("completed successfully"); 
     } catch (Exception ex) { 
      System.out.println("exception = " + ex); 
     } 

    } 

    public static void openUriWithEncode(String fullUrl) throws Exception { 

     System.out.println("openUriWithEncode(" + fullUrl + ")"); 
     URL url = new URL(fullUrl); 
     String query = url.getQuery() != null ? URLEncoder.encode(url.getQuery(), "UTF-8") : null; 
     URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), query, url.getRef()); 
     System.out.println("uri = " + uri.toASCIIString()); 
     url = new URL(uri.toASCIIString()); 
     URLConnection conn = url.openConnection(); 
     InputStream stream = conn.getInputStream(); 
     stream.close(); 
    } 

    public static void openUriNoEncode(String fullUrl) throws Exception { 

     System.out.println("openUriNoEncode(" + fullUrl + ")"); 
     URL url = new URL(fullUrl); 
     URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); 
     System.out.println("uri = " + uri.toASCIIString()); 
     url = new URL(uri.toASCIIString()); 
     URLConnection conn = url.openConnection(); 
     InputStream stream = conn.getInputStream(); 
     stream.close(); 
    } 
} 
+0

url.getQuery()在这个例子中返回什么? – JamesB 2014-12-04 00:38:41

+0

您的所有网址都适用于我,请再次检查。但是,URLEncoder.encode应该用于参数的值。请注意,您所做的URI调用应为您的查询提供URLEncode。 – 2014-12-04 01:05:59

回答

1

你编码包括=整个查询,所以当然=被编码。您只需要对键和值进行编码,例如

URLEncoder.encode(key)+"="+URLEncoder.encode(value) 
+0

我遇到的问题是如果我没有对=进行编码,那么它失败了。它不应该,但它确实如此。但现在它都按预期工作。很奇怪。 – 2014-12-05 00:48:31

+0

@DavidThielen我建议你错误地识别你的原始问题。 – EJP 2014-12-05 08:40:58

+0

可能。但那是我运行的代码,我遇到了这个问题。我也在想第一次在我的电脑上出现奇怪的现象。 – 2014-12-05 11:41:33