Java 带有包含空间的URL的HttpURLConnection

Java 带有包含空间的URL的HttpURLConnection,java,android,url,httpurlconnection,Java,Android,Url,Httpurlconnection,我有一个url,其中一个参数包含空格字符。如果我使用HttpURLConnection按原样发送,则该参数传递错误 如果我手动将空间替换为%20,它将按预期工作,因此我想知道是否有更干净的方法来执行此操作,尽管我希望HttpURLConnection将自动执行此操作。也许有一条路我错过了 在寻找这个时,我不断地碰到URLEncoder.Encode,它已被弃用,除了对整个URL(包括http://的URL)进行编码之外,我找不到任何其他方法来完成我的工作 是否有一种干净的方法来进行更换,或者我应

我有一个url,其中一个参数包含空格字符。如果我使用HttpURLConnection按原样发送,则该参数传递错误

如果我手动将空间替换为%20,它将按预期工作,因此我想知道是否有更干净的方法来执行此操作,尽管我希望HttpURLConnection将自动执行此操作。也许有一条路我错过了

在寻找这个时,我不断地碰到URLEncoder.Encode,它已被弃用,除了对整个URL(包括http://的URL)进行编码之外,我找不到任何其他方法来完成我的工作

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

url示例:“last¶m2=2014-31-10 11:40:00 param 1包含',param 2包含空格和:,但只有空格才有问题。这就是为什么我不明白为什么HttpUrlConnection只对空间如此敏感

谢谢

您可以使用

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

试试这种方法,希望这能帮助你解决问题。

:除字母('a'..'z'、'a'..'z')、数字('0'..'9')和字符“.”、'-'、'*'、''.'''.'外的所有字符都转换为以“%”开头的十六进制值

在URLEncoder类中,有两种方法:

1.encode(字符串url):此方法在API级别1中被弃用

String encodedUrl = URLEncoder.encode(url);
2.encode(String url,String charsetName):使用charsetName命名的字符集对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");

正如URLEncoder的javadoc中所述,您应该使用URLEncoder.encode(strings,stringenc)


与其使用HttpURLConnection,不如将HttpClient类与HttpPost类一起使用。这样可以避免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) {

}
字符串结果=”;
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(您的URL);
试一试{
ArrayList nameValuePairs=新的ArrayList();
添加(新的BasicNameValuePair(参数1,值1));
添加(新的BasicNameValuePair(参数2,值2));
...
添加(新的BasicNameValuePair(PARAMETERn,VALUEn));
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
HttpResponse response=httpclient.execute(httppost);
结果=EntityUtils.toString(response.getEntity());
}捕获(客户端协议例外e){
}捕获(IOE异常){
}
编辑:

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();
字符串结果=”;
URL=新URL(您的URL);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
连接设置读取超时(10000);
连接设置连接超时(15000);
conn.setRequestMethod(“POST”);
conn.setDoInput(真);
连接设置输出(真);
List nameValuePairs=新的ArrayList();
添加(新的BasicNameValuePair(参数1,值1));
添加(新的BasicNameValuePair(参数2,值2));
...
添加(新的BasicNameValuePair(PARAMETERn,VALUEn));
//发送请求
OutputStream os=conn.getOutputStream();
BufferedWriter writer=新的BufferedWriter(新的OutputStreamWriter(os,“UTF-8”));
write(getUrlParameters(params));
writer.flush();
writer.close();
os.close();
//得到回应
InputStream is=connection.getInputStream();
BufferedReader br=新的BufferedReader(新的InputStreamReader(is));
弦线;
StringBuffer响应=新的StringBuffer();
而((line=br.readLine())!=null){
响应。追加(行);
append('\r');
}
r、 close();
结果=response.toString();
连接断开();
getUrlParameters()方法的代码:

私有字符串getUrlParameters(列表参数)引发不支持的DencodingException{
StringBuilder参数=新的StringBuilder();
布尔值优先=真;
for(NameValuePair对:params)
{
parameter.append(URLEncoder.encode(pair.getName(),“UTF-8”);
参数。追加(“=”);
parameter.append(URLEncoder.encode(pair.getValue(),“UTF-8”);
参数。追加(&);
}
返回参数.toString().substring(0,参数.length()-2);
}

但我最初的方法很容易实现,从未让我失望过,甚至一次也没有。至于您希望使用哪种方法完全取决于您自己,您是选择HttpURLConnection(Android推荐的方法)还是其他方法

使用
URI
类构建URL;它将处理youTry要使用的所有内容:URLEncoder.encode()fge-我尝试过,但它返回了一个URI,当我添加.toString时,字符串再次被删除,带有空格。它对整个URL进行编码,包括params部分的=和-。我想知道HttpURLConnection怎么会自己不知道如何处理空间…你能发布你的url吗?然后我会尝试解决你的问题。感谢你更新你的回复,出于某种原因,只有空格字符会导致问题,因此不需要编码整个参数值。目前,我只将所有空格替换为%20,它可以正常工作。我想知道为什么HttpURLConnection会处理除空间之外的所有内容。对于编码整个url的记录,它对url的https://部分进行了编码,因此HttpURLConnection无法确定我们正在尝试进行https连接,因为它也不知道如何读取编码的url,所以ISTEP2也不起作用。第三个例子确实如此,但很混乱。真的有点悲哀HttpUrlConneciton自己不知道如何处理这个问题。这就是我现在所做的,我想知道HttpURLConnection是否有一种更干净的方法可以自动完成。我读到httpclient适用于旧版本的Android,新的实现应该使用HttpURLConnection。你在哪里读到过?无论如何,HttpURLConnection是一个通用的轻量级HTTP客户端。HttpClient比HttpUrlConnection快得多。您也可以查看此链接:阅读您链接到的答案的结尾及其下方的答案。我已编辑了我的答案,感谢您向我指出建议使用HttpURLConnection。我会试着找一个合适的理由
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);
}