【问题标题】:java android application cannot make http getjava android应用程序无法使http get
【发布时间】:2018-10-31 12:53:36
【问题描述】:

有人可以帮我从网上获取 json。在函数的末尾,jsonResponse 是空的。我用这个方法来做:

 private String getJson() {

    jsonResponsce = "";

    AsyncTask.execute(new Runnable() {
        @Override
        public void run() {
            try{

                URL httpbinEndpoint = new URL(webPage);
                HttpsURLConnection myConnection = (HttpsURLConnection) httpbinEndpoint.openConnection();

                myConnection.setRequestMethod("GET");

                // Enable writing
                myConnection.setDoOutput(true);

                String internetData = "";

                // Write the data
                myConnection.getOutputStream().write(internetData.getBytes());

                jsonResponsce = internetData;

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

    return jsonResponsce;
}

我为清单设置了 Internet 权限。我尝试从下一个地址获取 Json:https://shori-dodjo-mobile-app.firebaseio.com/.json。完整代码放在这里:https://github.com/GenkoKaradimov/Shori-Dodjo-Android-App/

【问题讨论】:

    标签: java android


    【解决方案1】:

    Json 对象通常以 HashMaps 的形式返回。 所以你可能需要类似 HashMap yourMap = new HashMap(); 然后 yourMap.get("另一边的对象名称", var 它也被保存了。); 现在看起来你要做的只是保存字节数据,但是这个字节数据需要有一个类型。希望这可以帮助。

    【讨论】:

    • 你从网络读取字节;他们没有固有的类型。如果你想要一个 HashMap,你需要解析这些字节并将它们放在一个 HashMap 中。
    【解决方案2】:

    您正在异步执行请求,因此该方法开始执行然后完成,因此没有结果。结果将在一秒钟内出现,但到那时 getJson 方法已经完成。您很可能需要将使用 json 的代码放在 run 方法的末尾。

    此外,您从流中读取的代码似乎是错误的。应该是这样的

    BufferedReader br = new BufferedReader(new InputStreamReader(myConnection.getInputStream()));
    
    jsonResponsce = br.lines().collect(Collectors.joining("\n"));
    

    (我没有测试过)

    【讨论】:

      【解决方案3】:

      您的代码中有多个问题:

      首先,AsyncTask 意味着它是 async(hronous),所以你不能马上返回结果。相反,覆盖AsyncTaskonPostExecute 并执行您需要对那里的数据执行的操作。 Here 是示例实现。

      其次,您使用的是getOutputStream,它用于写入连接,即将数据发送到服务器。在您的情况下,您需要 getInputStream 并从中读取。最简单的方法是将其包装在 BufferedReader 中并读取,直到它返回 -1(标记流的结尾),然后转换为字符串。

      有一些怪癖:您应该通过检查 HTTP 状态代码来处理或至少识别错误,处理编码(将字节转换为字符串部分),并处理响应被压缩时的情况,例如使用 DEFLATE 或 gzip。我已经以纯 Java 方式实现了它(reference code,警告:过时的文档),但我强烈建议使用已建立的库之一,例如 RetrofitVolley

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-25
        • 1970-01-01
        相关资源
        最近更新 更多