【问题标题】:Android HttpsURLConnection vs HttpClient, both give problemsAndroid HttpsURLConnection vs HttpClient,都出问题
【发布时间】:2011-11-14 05:08:52
【问题描述】:

我读到 HttpsURLConnection 在 2.3 之前有问题,我亲身体验过它有问题。

我尝试过的替代方案是 HttpClient,但是它给我带来了问题,因为它返回给我这个:

<?xml version="1.0" encoding="iso-8859-1"?>

当我显然应该取回 JSON 时。

HttpsURLConnection 可以很好地返回 JSON,但在处理许多请求时会出现一些不一致的结果。 (通过返回 JSON,我的意思是响应应该包含 JSON)

知道为什么 HttpClient 会返回一些 xml 标签而不是 JSON(应该返回什么)?

编辑——代码

HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost(url);

    List<NameValuePair> urlParams = new ArrayList<NameValuePair>();
        urlParams.add(new BasicNameValuePair("&platform=","Android"));
        urlParams.add(new BasicNameValuePair("&action=","signin"));
        urlParams.add(new BasicNameValuePair("&user",username));
        urlParams.add(new BasicNameValuePair("&pass",password));



    try {

        post.setEntity(new UrlEncodedFormEntity(urlParams, HTTP.UTF_8));
        HttpResponse resp = client.execute(post);
        BufferedReader rd = new BufferedReader(new InputStreamReader(
                resp.getEntity().getContent()));

        String line = "";
        JSONArray ja = new JSONArray();
        while ((line = rd.readLine()) != null) {
            Log.i("------>", line);
            ja = new JSONArray(line); //breaks here because it returns xml instead of JSON

        }
        rd.close();
        return ja;

    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }

这两个有更好的替代品吗?

【问题讨论】:

  • 我不知道这是否重要,但该网站是 https,而不是 http
  • 先告诉我是.net services还是php?
  • 应该返回 JSON 的代码是用 php 编写的
  • 别介意,当您在桌面浏览器中手动尝试时,您的 Url 是否提供 JSON 输出?
  • @Frankenstein ,是的;适用于浏览器和 httpsurlconnection

标签: android json httpclient httpurlconnection


【解决方案1】:

这看起来像是来自错误页面的服务器的响应。您可能会收到 404 错误或许多其他 http 错误。这只是您从服务器返回的 html 文件的开始。您确定该 url 是一个有效的 url,并且会接受来自移动设备的连接而不进行重定向吗?

【讨论】:

  • 是的,这就是问题所在,它与 HttpsURLConnection 完全兼容,而这只是它返回的一行。就是那个 xml 位。
【解决方案2】:

您应该从BasicNameValuePair key 中删除"&amp;" 字符。

BasicNameValuePair 在每个参数中自动附加"&amp;",因此无需添加"&amp;" 字符

你必须写如下

urlParams.add(new BasicNameValuePair("platform","Android"));

【讨论】:

    【解决方案3】:

    代替:

     List<NameValuePair> urlParams = new ArrayList<NameValuePair>();
            urlParams.add(new BasicNameValuePair("&platform=","Android"));
            urlParams.add(new BasicNameValuePair("&action=","signin"));
            urlParams.add(new BasicNameValuePair("&user",username));
            urlParams.add(new BasicNameValuePair("&pass",password));
    

    试试这个:

     List<NameValuePair> urlParams = new ArrayList<NameValuePair>();
            urlParams.add(new BasicNameValuePair("platform","Android"));
            urlParams.add(new BasicNameValuePair("action","signin"));
            urlParams.add(new BasicNameValuePair("user",username));
            urlParams.add(new BasicNameValuePair("pass",password));
    

    更新 1:

    你到底想在这里实现什么:

     String line = "";
            JSONArray ja = new JSONArray();
            while ((line = rd.readLine()) != null) {
                Log.i("------>", line);
                ja = new JSONArray(line); //breaks here because it returns xml instead of JSON
    
            }
    

    很明显会出错,因为您正试图从 XML 响应字符串创建 JSONArray,intsead 检查此 public JSONArray (String json) 函数并实现它。

    【讨论】:

    • @lazeR 有什么回应吗?显示 logcat 输出或响应,最好是准确的。
    • 响应只有一行: 并且错误是 nullpointerexceptions 因为 JSON 数组不是创建的,因为 XML 是't JSON 格式
    • Paresh,我知道它会中断,因为我正在尝试创建一个 JSONArray 但它不应该返回 XML 响应字符串。这就是问题
    猜你喜欢
    • 2014-06-11
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    相关资源
    最近更新 更多