【问题标题】:Make simply HTTP request and receive the content发出简单的 HTTP 请求并接收内容
【发布时间】:2017-11-06 18:16:12
【问题描述】:

我从How can I make a simple HTTP request in MainActivity.java? (Android Studio) 在这里找到了一个简单的HTTP 请求的工作代码,我将在下面发布它(有一些更改,如果我没记错的话,现在必须使用try{} catch{})。但是我想问我如何才能收到内容?我通过以下方式处理代码:

GetUrlContentTask req = new GetUrlContentTask();
req.execute("http://192.168.1.10/?pin=OFF1");
textView3.setText(req.doInBackground("http://192.168.1.10/?pin=OFF1")); 

GetUrlContentTask

private class GetUrlContentTask extends AsyncTask<String, Integer, String> {
    protected String doInBackground(String... urls) {
        // String content1 = "";
        try {
            URL url = new URL(urls[0]);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setDoOutput(true);
            connection.connect();


            BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String content = "", line;
            while ((line = rd.readLine()) != null) {
                content += line + "\n";
            }
            // content1 = content;
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        // return content1; - returns "", wrong
        return "aaa";
        //does not work    return content;
    }

    protected void onProgressUpdate(Integer... progress) {
    }

    protected void onPostExecute(String result) {
        // this is executed on the main thread after the process is over
        // update your UI here    
    }
}

【问题讨论】:

  • 你期望什么样的响应——一个json对象?
  • 我建议你使用Retrofit
  • @Barns52 我期待纯 HTML 文本。

标签: java android http


【解决方案1】:

将此添加到您的onPostExecute(String result) 通话中

    protected void onPostExecute(String result) {
        // this is executed on the main thread after the process is over
        // update your UI here    
        setMyData(result);
    }

然后填写您的文本字段或您需要更新的任何其他数据。

    private void setMyData(String result){
        textView3.setText(result); 
    }

【讨论】:

    【解决方案2】:

    你到底卡在哪里了?您的代码大部分是正确的,尽管您可能需要稍微重新排列它。您的范围有点偏离,您的注释代码几乎可以到达那里。见下文

    protected String doInBackground(String... urls) {
        String content = "", line = "";
        HttpURLConnection httpURLConnection;
        BufferedReader bufferedReader;
        URL url;
    
        try {
            for(String uri : urls) {
                url = new URL(uri);
                url = new URI(url.toURI().getScheme(), url.getAuthority(), url.getPath(), "pin=" + URLEncoder.encode("&OFF1", "UTF-8"), null).toURL();
    
                httpURLConnection = (HttpURLConnection) url.openConnection();
                httpURLConnection.setRequestMethod("GET");
                httpURLConnection.setDoOutput(true);
                httpURLConnection.connect();
    
    
                bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
                while ((line = bufferedReader.readLine()) != null) {
                    content += line + System.lineSeparator();
                }
            }
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             try {
                bufferedReader.close();
             } catch(Exception e) {
                 e.printStackTrace();
             }
         }
    
         return content;
    
    }
    

    这将返回您页面的字符串表示形式。如果页面包含 HTML,它将返回 text/html,如果它包含文本,它将仅返回文本。

    然后正如之前的用户所说,您可以在 GUI 上设置响应

    protected void onPostExecute(String result) {
        textView3.setText(result);
    }
    

    上面的例子在技术上是可行的。但是,我强烈建议在 HttpURLConnection 上使用 http://loopj.com/android-async-http/。您的代码会更好,这将很重要。

    我发送给您的代码假定参数始终为 pin=OFF1,因为它更像是一个概念证明

    【讨论】:

    • 代码在 "" 上设置 textView3 文本。更重要的是在线错误:bufferedReader.close();“bufferedReader 可能尚未初始化”。如果我尝试BufferedReader bufferedReader = null;,那么我在bufferedReader.close(); 行中收到未处理的异常
    • 因此,您的 OP 中“我找到了用于发出简单 HTTP 请求的有效代码”的声明确实不起作用。您的 OP 中的问题已得到回答 - 正确 - 您需要针对您提到的有关错误的问题打开一个新问题。将错误消息添加到该帖子。
    • 除非你的代码也不起作用,如果你回去阅读它,实际上根本没有解决这个问题。问题实际上与 get 参数有关。该代码在我的本地环境中运行,因为我的测试用例中没有 get 参数,并且我的编译错误设置配置不同。我建议你回去看看这个问题,因为你的解决方案甚至没有开始解决他遇到的问题,即该值在浏览器中返回,但在他的 Java 程序中没有返回。阅读他的原始帖子和第二个帖子中的 cmets。
    • 我绝不是批评您的回答!我只是向 OP 说(!):“我找到了一个用于发出简单 HTTP 请求的工作代码”并且“但我想问我如何接收内容?”这绝不是“ textView3.setText(req.doInBackground("192.168.1.10/?pin=OFF1"));"去上班!!
    • 抱歉 Czarek 在被跟踪之前,我已经解决了您的问题的一半。现在看一下代码并尝试一下。我认为问题出在您的 get 参数上。如果我对您的理解正确,您就会知道带有该 get 参数的 URL 在浏览器中返回了某些内容,但在您的 java 程序中返回的是空的。您最初有一个范围问题,我认为这是问题所在。但是我的测试用例是错误的,我没有使用 get 参数。在您发表评论后,我返回并修改了代码以不同方式包含您的参数。对不起,我的 javac 配置错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 2014-02-24
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    相关资源
    最近更新 更多