java.lang.IllegalArgumentException: 查询中的非法字符,索引为59。

8

我正在做什么: 我正在尝试在安卓设备上进行反向地理编码

我遇到的错误信息是: java.lang.IllegalArgumentException: Illegal character in query at index 59: http://maps.google.com/maps/api/geocode/json?address=Agram, Bengaluru, Karnataka, India&sensor=false

注意:在浏览器中该请求可以得到JSON响应,但从下面的代码中却不能获得相同的结果

出问题的代码行是这一行:

HttpGet httpget = new HttpGet(url);

JSONfunctions.java

public class JSONfunctions {

    public static JSONObject getJSONfromURL(String url) {
        InputStream is = null;
        String result = "";
        JSONObject jArray = null;

        // Download JSON data from URL
        try {
            HttpClient httpclient = new DefaultHttpClient();
            HttpGet httpget = new HttpGet(url);

            HttpResponse response = httpclient.execute(httpget);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();

        } catch (Exception e) {
            Log.e("log_tag", "Error in http connection " + e.toString());
        }

        // Convert response to string
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            result = sb.toString();
        } catch (Exception e) {
            Log.e("log_tag", "Error converting result " + e.toString());
        }

        try {

            jArray = new JSONObject(result);
        } catch (JSONException e) {
            Log.e("log_tag", "Error parsing data " + e.toString());
        }

        return jArray;
    }
}

1
考虑对URL参数值进行URL编码。 - laalto
@laalto...您能否以答案的形式展示一下,我对于进行编码请求还很陌生! - Devrath
可能是Java URL编码的重复问题。 - ToYonos
3个回答

15

使用URLEncoder.encode()address参数的值"Agram, Bengaluru, Karnataka, India"进行编码,然后再将其放入URL字符串中,以便变成以下格式:

http://maps.google.com/maps/api/geocode/json?address=Agram,+Bengaluru,+Karnataka,+India&sensor=false

即空格变成了+,其他特殊字符表示为%xx

浏览器会自动对在地址栏中输入的字符串进行智能URL编码,这就是为什么它在那里起作用的原因。


当我尝试这样做时,响应中会出现 java.lang.IllegalStateException: Target host must not be null, or set in parameters. scheme=null, host=null, 的错误提示。 - Devrath
2
不要对整个URL进行编码,只需对URL的一部分参数值进行编码。 - laalto
laalto 非常有帮助,谢谢。 - Ritesh Gune

6

构建您的URL,如下所示:

final StringBuilder request = new StringBuilder(
        "http://maps.googleapis.com/maps/api/geocode/json?sensor=false");
request.append("&language=").append(Locale.getDefault().getLanguage());
request.append("&address=").append(
        URLEncoder.encode(locationName, "UTF-8"));

2
我正在使用httpclient 4.3.3。
String messagestr = "Welcome to Moqui World";
String url="http://my.example.com/api/sendhttp.phpauthkey="+URLEncoder.encode("17djssnvndkfjb110d3","UTF-8")+"&mobiles=91"+URLEncoder.encode(contactNumber,"UTF-8")+"&message="+URLEncoder.encode(messagestr,"UTF8")+"&sender="+URLEncoder.encode("WMOQUI","UTF-8")+"&route=4";

HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet(url);
HttpResponse response = client.execute(request);

对我来说,它工作得很好。希望这可以帮到你。


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