Make simply HTTP request and receive the content

2019-09-19 11:15发布

问题:

I have found a working code for makeing simply HTTP requests here, from How can I make a simple HTTP request in MainActivity.java? (Android Studio) and I am going to post it below (with some changes, if I am not wrong it is now necessery to use try{} catch{}). But I would like to ask how I can receive the content? I work with the code in the following way:

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    
    }
}

回答1:

Add this to your onPostExecute(String result) call

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

And then fill your textfield or whatever other data you need to update.

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


回答2:

Where exactly are you stuck? Your code mostly correct although you may need to rearrange it slightly. Your scope is a bit off and your commented code almost gets there. See below

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;

}

That will return a String representation of your page. If the page contains HTML it will return text/html, if it contains text it will return just text.

Then as a previous user stated you can set the response on your GUI

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

The above example will technically work. However, I would highly recommend using http://loopj.com/android-async-http/ over HttpURLConnection. Your code will be much nicer which will matter down the line.

The code I sent you assumes that the parameter is always pin=OFF1 because it's more a proof of concept