URL 非法字符

3

这是我的代码:

HttpClient client = new DefaultHttpClient();
            client.getParams().setParameter(CoreProtocolPNames.USER_AGENT, "android");
            HttpGet request = new HttpGet();
            request.setHeader("Content-Type", "text/plain; charset=utf-8");
            Log.d("URL", convertURL(URL));
            request.setURI(new URI(URL));
            HttpResponse response = client.execute(request);
            bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            StringBuffer stringBuffer = new StringBuffer("");
            String line = "";
            String NL = System.getProperty("line.separator");

我不知道我的URL哪里出了错:

http://localhost/CyborgService/chatservice.php?action=recive_game&nick_sender=mkdarkness&pass=MV030595&date_last=2012-11-18 09:46:37&id_game=1

我已经使用了一个转换URL的函数,但是没有起作用。但是,如果我在浏览器中尝试打开这个URL,它可以成功打开。
以下是我的错误信息:
11-18 21:46:37.766: E/GetHttp(823): java.net.URISyntaxException: Illegal character in query at index 127: http://192.168.0.182/CyborgService/chatservice.php?action=recive_game&nick_sender=mkdarkness&pass=MV030595&date_last=2012-11-18 09:46:37&id_game=1

我没有数出这127个字符,但我猜测2012-11-18 09:46:37中的空格可能是问题所在... - Sam
3个回答

10

您的URL中在127号位置有一个空格。日期生成为“date_last=2012-11-18 09:46:37”,这会导致打开URL时出错。

尽管浏览器可以将空格转换为“%20”或“+”,这两个都是URL中空格的有效表示,但是URL中正式不接受空格。您应该转义所有字符:您可以将空格替换为“+”或只需通过URLEncoder处理字符串即可。

要使用URLEncoder,请参见例如此问题:仅对参数值进行URLEncoder编码,而不是完整的URL。或者使用具有多个参数而非单个参数的URI构造函数之一。您没有展示构造URL的代码,因此我无法明确评论。但是如果您有参数映射parameterMap,则可能如下所示:

String url = baseUrl + "?";
for (String key : parameterMap.keys())
{
  String value = parameterMap.get(key);
  String encoded = URLEncoder.encode(value, "UTF-8");
  url += key + "&" + encoded;
}

我们可以在其他的时间讨论为什么Java需要设置编码并且要求编码为“UTF-8”,而不是将“UTF-8”作为默认编码,但现在这段代码应该可以解决问题。


1
是的,你需要使用URLEncoder。问题不仅仅是空格。这将生成编码后的URL,在所有情况下都可以使用。+1 - IAmGroot
alexinblue,我试着使用URLEncoder,但是我的url没有成功,它是这样的:http%3A%2F%2F192.168.0.182%2FCyborgService%2Fchatservice.php%3Faction%3Drecive_game%26nick_sender%3Dmkdarkness%26pass%3DMV030595%26date_last%3D2012-11-19+12%3A40%3A05%26id_game%3D1还有一个错误:java.lang.IllegalStateException: Target host must not be null, or set in parameters. - Marcos Bergamo
谢谢接受,我会添加一段关于如何使用URLEncoder的内容。 - alexfernandez

2

这里有一个空格字符:

...2012-11-18 09:46:37... (在索引127处,就像错误消息所说的一样)。

尝试用%20替换它。


0

这样做肯定会帮助你

    HttpClient myClient = new DefaultHttpClient();

            HttpPost myConnection = new HttpPost("http://192.168.1.2/AndroidApp/SendMessage");

            try {

    //Your parameter should be as..

                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
                nameValuePairs.add(new BasicNameValuePair("messageText", msgText));
                nameValuePairs.add(new BasicNameValuePair("senderUserInfoId", loginUserInfoId));

//set parameters to ur URL

                myConnection.setEntity(new UrlEncodedFormEntity(nameValuePairs));
//execute the connection
                HttpResponse response = myClient.execute(myConnection);
    }
    catch (ClientProtocolException e) {

                //e.printStackTrace();
            } catch (IOException e) {
                //e.printStackTrace();
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接