包含空格的URL的HttpURLConnection

时间:2014-10-31 09:15:29

标签: java android url httpurlconnection

我有一个网址,其中一个参数包含空格字符。如果我按原样发送它,使用HttpURLConnection,这个参数错误地传递。

如果我用%20手动替换空格,它会按预期工作,所以我想知道是否有更简洁的方法这样做虽然我希望HttpURLConnection会自动完成。也许有一种我错过的方式?

在寻找这个时,我不断碰到不推荐使用的URLEncoder.Encode,除了编码整个URL(包括http的://)之外,我找不到任何其他办法来做我做的事情。

是否有一种干净的方法来进行更换,还是应该手动进行?

url例如:http://www.domain.com?param1=name' last& param2 = 2014-31-10 11:40:00 param 1包含'和param2包含空格和:但只有空格才会产生问题。这就是为什么我不明白为什么HttpUrlConnection只对空间如此敏感。

由于

4 个答案:

答案 0 :(得分:5)

请尝试这种方式,希望这有助于您解决问题。

URLEncoder:除字母外的所有字符(' a' ...'',' A' ..' Z&#39 ;)和数字(' 0' ...' 9')和字符'。',' - ',' *',' _'转换为'%'前面的十六进制值。

在URLEncoder类中有两种方法:

1.encode(String url):此方法在API级别1中已弃用

String encodedUrl = URLEncoder.encode(url);

2.encode(String url,String charsetName):使用charsetName命名的Charset对url进行编码。

String encodedUrl = URLEncoder.encode(url,"UTF-8");

使用方法:

String url ="http://www.domain.com";
String param1 ="?param1=";
Strinf param1value ="name'last";
String param2 ="&param2=";
Strinf param2value ="2014-31-10 11:40:00";
String encodeUrl = url +param1+ URLEncoder.encode(param1value,"UTF-8")+param2+URLEncoder.encode(param2value,"UTF-8");

答案 1 :(得分:1)

你可以使用

 String oldurl="http://pairdroid.com/whatsapp.php?a=rajesh saini";
 String newurl=oldurl.replaceAll(" ","%20");
 URL url = new URL(newurl);

答案 2 :(得分:0)

如URLEncoder的javadoc所述,你应该使用URLEncoder.encode(String s,String enc)

http://docs.oracle.com/javase/7/docs/api/java/net/URLEncoder.html#encode(java.lang.String,%20java.lang.String)

答案 3 :(得分:-2)

为什么不使用HttpClient类和HttpPost类,而不是使用HttpURLConnection。这样就可以避免URL编码的紧张。以下是如何使用的示例:

String result = "";
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(YOUR URL);
try {
    ArrayList<BasicNameValuePair> nameValuePairs = new ArrayList<BasicNameValuePair>();
    nameValuePairs.add(new BasicNameValuePair(PARAMETER1, VALUE1));
    nameValuePairs.add(new BasicNameValuePair(PARAMETER2, VALUE2));
    ...
    nameValuePairs.add(new BasicNameValuePair(PARAMETERn, VALUEn));

    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    HttpResponse response = httpclient.execute(httppost);
    result = EntityUtils.toString(response.getEntity());
} catch (ClientProtocolException e) {

} catch (IOException e) {

}

编辑:

String result = "";
URL url = new URL(YOUR URL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair(PARAMETER1, VALUE1));
nameValuePairs.add(new BasicNameValuePair(PARAMETER2, VALUE2));
...
nameValuePairs.add(new BasicNameValuePair(PARAMETERn, VALUEn));

//Send request
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
writer.write(getUrlParameters(params));
writer.flush();
writer.close();
os.close();

//Get Response  
InputStream is = connection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
StringBuffer response = new StringBuffer(); 
while((line = br.readLine()) != null) {
    response.append(line);
    response.append('\r');
}
r.close();
result = response.toString();

conn.disconnect();

getUrlParameters()方法的代码:

private String getUrlParameters(List<NameValuePair> params) throws UnsupportedEncodingException{
    StringBuilder parameter = new StringBuilder();
    boolean first = true;

    for (NameValuePair pair : params)
    {
        parameter.append(URLEncoder.encode(pair.getName(), "UTF-8"));
        parameter.append("=");
        parameter.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
        parameter.append("&");
    }
    return parameter.toString().substring(0, parameter.length()-2);
}

但我最初的方法很容易实现,并且从来没有让我失望过。至于您希望完全使用哪种方法,请使用HttpURLConnection(Android推荐方法)或另一种方法。