Страницы

Поиск по вопросам

Показаны сообщения с ярлыком httpurlconnection. Показать все сообщения
Показаны сообщения с ярлыком httpurlconnection. Показать все сообщения

воскресенье, 12 января 2020 г.

Работа с HttpURLConnection в Android, полечение информации по GET

#java #android #http #get #httpurlconnection


Нужно получить результат GET запроса в Android и вернуть значение из метода.
Решено! Всем спасибо за участие!

public void sayHello(View view)throws IOException {
        Thread httpThread = new Thread(new Runnable() {
            public void run() {
                String mybla = sendGet();
            }
        });
        httpThread.start();
    }
private String sendGet(){
        try{
            String mystr = "http://www.pravda.com.ua";
            URL obj = new URL(mystr);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
            con.setRequestMethod("GET");
            con.setRequestProperty("User-Agent", "Mozilla/5.0");
            con.setRequestProperty("Accept-Charset", "UTF-8");
            InputStream response = con.getInputStream();
            Scanner s = new Scanner(response).useDelimiter("\\A");
            String result = s.hasNext() ? s.next() : "";
            return result;
        }
        catch (Exception e) {
            return e.toString();
        }
    }

    


Ответы

Ответ 1



Все делаете правильно. Для того, чтобы прочитать поток и получить из него String, можете воспользоваться, например, библиотекой Apache commons IOUtils (офф. сайт). С её помощью: String result = IOUtils.toString(inputStream); Если предпочетаете способ без сторонних библиотек (что я приветствую, потому что это позволяет узнать что-то новое о языке, в котором вы новичек), то делайте например так: Scanner s = new Scanner(inputStream).useDelimiter("\\A"); String result = s.hasNext() ? s.next() : ""; UPD: Заверните в new Thread(new Runnable() { public void run() { //вызовите ваш код для сетевого запроса } }).start(); Когда ваш запрос вернул результат внутри вашего Thread, чтобы поменять элемент интерфейса вам понадобится сделать это из UI-потока. Для этого используйте Context.runOnUiThread();.

Ответ 2



Код с использованием либы OkHttp OkHttpClient client = new OkHttpClient.Builder().build(); String url = ...; Request.Builder request = new Request.Builder(); request.url(url); request.get(); Response response = client.newCall(request.build()).execute(); String response = response.body().string(); System.out.println(response ); Надо помнить, что на андроид запросы в сеть можно с API14 делать только вне UI потока. Например через AsynkTask, Thread etc

суббота, 14 декабря 2019 г.

Исключение NetworkOnMainThreadException

#android #httpurlconnection


Возникла проблема: при обращении к http-серверу появляется исключение android.os.NetworkOnMainThreadException,
сложность в том, что исключение происходит внутри класса, наследованного от AsyncTask.

Фрагмент кода:

public class NH {
public static String URL_SERVER = "http://myserver.com/";
public static String DIR_IMAGES = "images/";

public void updateData() {
    List imgFiles = new ArrayList();
    imgFiles.add("t001.png");
    imgFiles.add("t002.png");
    imgFiles.add("t003.png");

    for (String img :imgFiles) {
        (new GetImages()).doInBackground(img);
    }
}

class GetImages extends AsyncTask {

    @Override
    private Void doInBackground(String... params) {
        String imgName = params[0];

        try {
            URL url = new URL( URL_SERVER + DIR_IMAGES + imgName);

            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setDoInput(true);
            httpURLConnection.setDoOutput(true);
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(httpURLConnection.getInputStream(),"UTF-8"));

            in.close();
        } catch (Exception e) {
            Log.e("log_tag", "Error in http connection " + e.toString());
        }
        return null;
    }
}
}


Результат: 'log_tag: Error in http connection android.os.NetworkOnMainThreadException'

Среда разработки: Android Studio 1.5.1

Спасибо за помощь!
    


Ответы

Ответ 1



AsyncTask нужно запускать методом execute(); , а вы запускаете всего лишьт его метод doInBackground

среда, 6 марта 2019 г.

Работа с HttpURLConnection в Android, полечение информации по GET

Нужно получить результат GET запроса в Android и вернуть значение из метода. Решено! Всем спасибо за участие!
public void sayHello(View view)throws IOException { Thread httpThread = new Thread(new Runnable() { public void run() { String mybla = sendGet(); } }); httpThread.start(); } private String sendGet(){ try{ String mystr = "http://www.pravda.com.ua"; URL obj = new URL(mystr); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); con.setRequestMethod("GET"); con.setRequestProperty("User-Agent", "Mozilla/5.0"); con.setRequestProperty("Accept-Charset", "UTF-8"); InputStream response = con.getInputStream(); Scanner s = new Scanner(response).useDelimiter("\\A"); String result = s.hasNext() ? s.next() : ""; return result; } catch (Exception e) { return e.toString(); } }


Ответ

Все делаете правильно. Для того, чтобы прочитать поток и получить из него String, можете воспользоваться, например, библиотекой Apache commons IOUtils (офф. сайт). С её помощью:
String result = IOUtils.toString(inputStream);
Если предпочетаете способ без сторонних библиотек (что я приветствую, потому что это позволяет узнать что-то новое о языке, в котором вы новичек), то делайте например так:
Scanner s = new Scanner(inputStream).useDelimiter("\\A"); String result = s.hasNext() ? s.next() : "";
UPD
Заверните в
new Thread(new Runnable() { public void run() { //вызовите ваш код для сетевого запроса } }).start();
Когда ваш запрос вернул результат внутри вашего Thread, чтобы поменять элемент интерфейса вам понадобится сделать это из UI-потока. Для этого используйте Context.runOnUiThread();

вторник, 13 ноября 2018 г.

Исключение NetworkOnMainThreadException

Возникла проблема: при обращении к http-серверу появляется исключение android.os.NetworkOnMainThreadException, сложность в том, что исключение происходит внутри класса, наследованного от AsyncTask.
Фрагмент кода:
public class NH { public static String URL_SERVER = "http://myserver.com/"; public static String DIR_IMAGES = "images/";
public void updateData() { List imgFiles = new ArrayList(); imgFiles.add("t001.png"); imgFiles.add("t002.png"); imgFiles.add("t003.png");
for (String img :imgFiles) { (new GetImages()).doInBackground(img); } }
class GetImages extends AsyncTask {
@Override private Void doInBackground(String... params) { String imgName = params[0];
try { URL url = new URL( URL_SERVER + DIR_IMAGES + imgName);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setDoInput(true); httpURLConnection.setDoOutput(true); BufferedReader in = new BufferedReader( new InputStreamReader(httpURLConnection.getInputStream(),"UTF-8"));
in.close(); } catch (Exception e) { Log.e("log_tag", "Error in http connection " + e.toString()); } return null; } } }
Результат: 'log_tag: Error in http connection android.os.NetworkOnMainThreadException'
Среда разработки: Android Studio 1.5.1
Спасибо за помощь!


Ответ

AsyncTask нужно запускать методом execute(); , а вы запускаете всего лишьт его метод doInBackground