Страницы

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

вторник, 31 декабря 2019 г.

Как отправить GET-запрос на Android?

#java #android #http #сеть


Не могу отправить GET запрос на android'е.
try {
    URL url = new URL("http://10.0.2.2/denwer/php/index.php");
    url.openConnection();

} catch (Exception e) {
    Context context = getApplicationContext();
    Toast toast = Toast.makeText(context, e.getMessage(),
    Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.CENTER, 0, 0);
    toast.show();
}

Но почему-то index.php не выполняется (должны заноситься данные в базу), и исключение
не вызывается. Хотя если я открываю этот адрес в браузере на андроиде, то скрипт выполняется.
Что делать?    


Ответы

Ответ 1



Вот так все будет :) URL url = new URL("http://10.0.2.2/denwer/php/index.php"); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { // все ок } else { // ошибка } Без вызова getResponseCodeзапрос на сервер фактически не посылается.

Ответ 2



Советую добавить чтение. У меня тоже url.openConnection(); проходило, а дальше падало. Оказалось забыл разрешение на интернет. Кстати у вас оно стоит?

Ответ 3



Вот так это делается HashMap postDataParams = new HashMap(); postDataParams.put("some_param","1"); URL url; String response = ""; try { url = new URL(requestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(15000); conn.setConnectTimeout(15000); conn.setRequestMethod("GET"); conn.setDoInput(true); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(os, "UTF-8")); writer.write(getPostDataString(postDataParams)); writer.flush(); writer.close(); os.close(); int responseCode=conn.getResponseCode(); if (responseCode == HttpsURLConnection.HTTP_OK) { String line; BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream())); while ((line=br.readLine()) != null) { response+=line; } } else { response=""; throw new HttpException(responseCode+""); } } catch (Exception e) { e.printStackTrace(); } private String getPostDataString(HashMap params) throws UnsupportedEncodingException{ StringBuilder result = new StringBuilder(); boolean first = true; for(Map.Entry entry : params.entrySet()){ if (first) first = false; else result.append("&"); result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); result.append("="); result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); } return result.toString(); }

Ответ 4



Есть несколько способов. В зависимости от ситуации можно выбрать тот или иной. Также, обязательно надо учитывать особенности платформы. А именно: Требуется явно указать разрешение на сетевые запросы в манифесте (Перед тэгом Application надо добавить ). Делать запрос надо не на главном потоке (с API >= 11 будет возникать NetworkOnMainThreadException). В итоге стандартный Java способ отправления сетевых запросов на андроиде не будет работать сразу по двум причинам. Также надо учитывать, что стандартный код для сетевых запрос сложен, излишен и в реальном мире почти не используется. Используются библиотеки. Самые популярные: OkHttp и Retrofit (В последний входит первая и она используется для облегчения работы со сторонним web-API) Вот простейший пример для простейшего GET запроса с использованием OkHttp: Подключаем библиотеку в build.gradle (module app) implementation("com.squareup.okhttp3:okhttp:4.0.0") Отправляем асинхронно запрос: Request request = new Request.Builder() .url(url) .build(); new OkHttpClient().newCall(request) .enqueue(new Callback() { @Override public void onFailure(final Call call, IOException e) { // Error } @Override public void onResponse(Call call, final Response response) throws IOException { String res = response.body().string(); } }); Таким образом библиотека решает вопрос исполнения запроса не на главном потоке - ответ и ошибка придут в главном, а сам запрос будет сделан в фоне. Если не использовать эту библиотеку, а брать стандартные способы, то исполнять запрос в другом потоке придётся вручную, используя Thread, AsyncTask, Loaders etc. В итоге кода будет больше и ошибиться будет проще. Указанный выше подход подойдёт для одного-двух простых запросов. Если же у вас много запросов к серверу и идёт обмен структурированными данными (JSON, XML, etc), то надо брать связку OkHttp + Retrofit + RxJava(опционально). С их использованием, после всех подготовительных процедур сложные сценарии типа Сделай запрос на А, получи массив юзеров, для каждого юзера сделай запрос на Б и верни список ответов с Б может выглядеть примерно так (код на kotlin): api .getA() .flatMap { Observable.fromIterable(it) } .flatMap { api.getB(it) } .toList() .subscribeOn(Schedullers.io()) .observeOn(AndroidSchedullers.mainThread()) .subscribeBy { println(it) } //выведет список ответов B для каждого обхекта в JSON ответе А

Комментариев нет:

Отправить комментарий