【问题标题】:android java.lang.IllegalArgumentException in HttpGet [duplicate]HttpGet中的android java.lang.IllegalArgumentException [重复]
【发布时间】:2013-02-22 00:47:50
【问题描述】:

我正在尝试从远程服务器获取响应。这是我的代码:

private static String baseRequestUrl = "http://www.pappico.ru/promo.php?action=";

    @SuppressWarnings("deprecation")
    public String executeRequest(String url) {
        String res = "";
        HttpClient httpClient = new DefaultHttpClient();
        HttpResponse response;      

        try {   
            //url = URLEncoder.encode(url, "UTF-8");
            HttpGet httpGet = new HttpGet(url);

            response = httpClient.execute(httpGet);
            Log.d("MAPOFRUSSIA", response.getStatusLine().toString());

            HttpEntity entity = response.getEntity();

            if (entity != null) {
                InputStream inStream = entity.getContent();
                res = streamToString(inStream);

                inStream.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return res; 
    }

    public String registerUser(int userId, String userName) {
        String res = "";
        String request = baseRequestUrl + "RegisterUser&params={\"userId\":" +
                 userId + ",\"userName\":\"" + userName + "\"}";

        res = executeRequest(request);

        return res; 
    }

我在HttpGet httpGet = new HttpGet(url) 行中遇到以下异常:

java.lang.IllegalArgumentException:索引 59 处的查询中存在非法字符:http://www.pappico.ru/promo.php?action=RegisterUser&params={"userId":1,"userName":"Юрий Клинских"}

'{' 字符有什么问题?我已经阅读了一些关于此异常的帖子并找到了解决方案,但此解决方案会导致另一个异常:如果我取消注释行 url = URLEncoder.encode(url, "UTF-8"); 它会在行 response = httpClient.execute(httpGet); 出现这样的异常:

java.lang.IllegalStateException:目标主机不能为空,或在参数中设置。 scheme=null, host=null, path=http://www.pappico.ru/promo.php?action=RegisterUser&params={"userId":1,"userName":"Юрий+Клинских"}

不知道我该怎么做才能让它工作。任何帮助将不胜感激:)

【问题讨论】:

    标签: java android httpclient


    【解决方案1】:

    您必须对 URL 参数进行编码:

    String request = baseRequestUrl + "RegisterUser&params=" +    
            java.net.URLEncoder.encode("{\"userId\":" + userId + ",\"userName\":\"" + userName + "\"}", "UTF-8");
    

    【讨论】:

    • 这样做并在响应行获取异常 android.os.NetworkOnMainThreadException = httpClient.execute(httpGet);`
    • 在我看来这是我的错误 - 我正在通过 UI 线程处理网络))
    【解决方案2】:

    试试:

    public String registerUser(int userId, String userName) {
            String res = "";
    
            String json = "{\"userId\":" +
                     userId + ",\"userName\":\"" + userName + "\"}";
            String encodedJson = URLEncoder.encode(json, "utf-8");
    
            String request = baseRequestUrl + "RegisterUser&params=" + encodedJson;
    
            res = executeRequest(request);
            return res;
        }
    

    (这会将 URL 片段编码为 params=...),而不是整个 URL。你也可以看看上面提到的可能的duplicate


    奖金: 请注意,JSON 通常通过 POST(而不是 GET)传输。您可以使用“Live Headers”之类的程序并手动执行这些步骤(例如注册用户)以查看幕后发生的事情。在这种情况下,您将在实体正文中发送 {..} 信息。这是一种方法 - HTTP POST using JSON in Java

    另外,另一种编写 JSON 的方法(尤其是当它变得更复杂时)是使用模型类,然后使用 ObjectMapper(例如 Jackson)将其转换为字符串。这很方便,因为您可以避免在字符串中使用像 \" 这样的格式。

    这里有一些例子:JSON to Java Objects, best practice for modeling the json stream

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 2013-06-08
      • 1970-01-01
      • 2018-07-06
      相关资源
      最近更新 更多