Сделать запрос HTTP с помощью андроида

Я искал везде, но я не мог найти ответ, есть ли способ сделать простой HTTP-запрос? Я хочу запросить страницу / сценарий PHP на одном из моих веб-сайтов, но я не хочу показывать веб-страницу.

Если возможно, я даже хочу сделать это в фоновом режиме (в BroadcastReceiver)

Solutions Collecting From Web of "Сделать запрос HTTP с помощью андроида"

ОБНОВИТЬ

Это очень старый ответ. Я определенно не буду рекомендовать клиента Apache. Вместо этого используйте HttpUrlConnection или OkHttp .

ОБНОВИТЬ

Прежде всего, запросите разрешение на доступ к сети, добавьте следующее в свой манифест:

<uses-permission android:name="android.permission.INTERNET" /> 

Тогда самый простой способ – использовать клиент Apache http в комплекте с Android:

  HttpClient httpclient = new DefaultHttpClient(); HttpResponse response = httpclient.execute(new HttpGet(URL)); StatusLine statusLine = response.getStatusLine(); if(statusLine.getStatusCode() == HttpStatus.SC_OK){ ByteArrayOutputStream out = new ByteArrayOutputStream(); response.getEntity().writeTo(out); String responseString = out.toString(); out.close(); //..more logic } else{ //Closes the connection. response.getEntity().getContent().close(); throw new IOException(statusLine.getReasonPhrase()); } 

Если вы хотите, чтобы он работал в отдельном потоке, я бы рекомендовал расширить AsyncTask:

 class RequestTask extends AsyncTask<String, String, String>{ @Override protected String doInBackground(String... uri) { HttpClient httpclient = new DefaultHttpClient(); HttpResponse response; String responseString = null; try { response = httpclient.execute(new HttpGet(uri[0])); StatusLine statusLine = response.getStatusLine(); if(statusLine.getStatusCode() == HttpStatus.SC_OK){ ByteArrayOutputStream out = new ByteArrayOutputStream(); response.getEntity().writeTo(out); responseString = out.toString(); out.close(); } else{ //Closes the connection. response.getEntity().getContent().close(); throw new IOException(statusLine.getReasonPhrase()); } } catch (ClientProtocolException e) { //TODO Handle problems.. } catch (IOException e) { //TODO Handle problems.. } return responseString; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); //Do anything with response.. } } 

Затем вы можете сделать запрос:

  new RequestTask().execute("http://stackoverflow.com"); 

Если у вас нет явной причины выбирать Apache HttpClient, вы должны предпочесть java.net.URLConnection. Вы можете найти множество примеров того, как использовать его в Интернете.

Мы также улучшили документацию на Android с вашего оригинального сообщения: http://developer.android.com/reference/java/net/HttpURLConnection.html

И мы говорили о компромиссах в официальном блоге: http://android-developers.blogspot.com/2011/09/androids-http-clients.html

Примечание. HTTP-клиент Apache в комплекте с Android теперь устарел в пользу HttpURLConnection . Дополнительную информацию см. В блоге разработчиков Android.

Добавьте в свой манифест <uses-permission android:name="android.permission.INTERNET" /> .

Затем вы извлекли бы такую ​​веб-страницу:

 URL url = new URL("http://www.android.com/"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); try { InputStream in = new BufferedInputStream(urlConnection.getInputStream()); readStream(in); finally { urlConnection.disconnect(); } } 

Я также предлагаю запустить его в отдельном потоке:

 class RequestTask extends AsyncTask<String, String, String>{ @Override protected String doInBackground(String... uri) { String responseString = null; try { URL url = new URL(myurl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); if(conn.getResponseCode() == HttpsURLConnection.HTTP_OK){ // Do normal input or output stream reading } else { response = "FAILED"; // See documentation for more info on response handling } } catch (ClientProtocolException e) { //TODO Handle problems.. } catch (IOException e) { //TODO Handle problems.. } return responseString; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); //Do anything with response.. } } 

Дополнительную информацию об обработке ответов и POST-запросах см. В документации .

 private String getToServer(String service) throws IOException { HttpGet httpget = new HttpGet(service); ResponseHandler<String> responseHandler = new BasicResponseHandler(); return new DefaultHttpClient().execute(httpget, responseHandler); } 

С уважением

С потоком:

 private class LoadingThread extends Thread { Handler handler; LoadingThread(Handler h) { handler = h; } @Override public void run() { Message m = handler.obtainMessage(); try { BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); String page = ""; String inLine; while ((inLine = in.readLine()) != null) { page += inLine; } in.close(); Bundle b = new Bundle(); b.putString("result", page); m.setData(b); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } handler.sendMessage(m); } } 

Посмотрите на эту потрясающую новую библиотеку, доступную через gradle 🙂

Build.gradle: compile 'com.apptakk.http_request:http-request:0.1.2'

Применение:

 new HttpRequestTask( new HttpRequest("http://httpbin.org/post", HttpRequest.POST, "{ \"some\": \"data\" }"), new HttpRequest.Handler() { @Override public void response(HttpResponse response) { if (response.code == 200) { Log.d(this.getClass().toString(), "Request successful!"); } else { Log.e(this.getClass().toString(), "Request unsuccessful: " + response); } } }).execute(); 

https://github.com/erf/http-request

Я сделал это для веб-службы, чтобы запросить URL-адрес, используя Gson lib:

Клиент:

 public EstabelecimentoList getListaEstabelecimentoPorPromocao(){ EstabelecimentoList estabelecimentoList = new EstabelecimentoList(); try{ URL url = new URL("http://" + Conexao.getSERVIDOR()+ "/cardapio.online/rest/recursos/busca_estabelecimento_promocao_android"); HttpURLConnection con = (HttpURLConnection) url.openConnection(); if (con.getResponseCode() != 200) { throw new RuntimeException("HTTP error code : "+ con.getResponseCode()); } BufferedReader br = new BufferedReader(new InputStreamReader((con.getInputStream()))); estabelecimentoList = new Gson().fromJson(br, EstabelecimentoList.class); con.disconnect(); } catch (IOException e) { e.printStackTrace(); } return estabelecimentoList; } 

Это новый код для HTTP Get / POST-запроса в android. HTTPClient лишен и может быть недоступен, как это было в моем случае.

Сначала добавьте две зависимости в build.gradle:

 compile 'org.apache.httpcomponents:httpcore:4.4.1' compile 'org.apache.httpcomponents:httpclient:4.5' 

Затем напишите этот код в ASyncTask в методе doBackground .

  URL url = new URL("http://localhost:8080/web/get?key=value"); HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); urlConnection.setRequestMethod("GET"); int statusCode = urlConnection.getResponseCode(); if (statusCode == 200) { InputStream it = new BufferedInputStream(urlConnection.getInputStream()); InputStreamReader read = new InputStreamReader(it); BufferedReader buff = new BufferedReader(read); StringBuilder dta = new StringBuilder(); String chunks ; while((chunks = buff.readLine()) != null) { dta.append(chunks); } } else { //Handle else } 

Самый простой способ – использовать Android lib под названием Volley

Волейбол предлагает следующие преимущества:

Автоматическое планирование сетевых запросов. Несколько одновременных сетевых подключений . Прозрачное кэширование ответов на диск и память с согласованием стандартного HTTP-кэша. Поддержка приоритизации запроса. API запроса отмены. Вы можете отменить один запрос, или вы можете установить блоки или области запросов для отмены. Простота настройки, например, для повторной попытки и отсрочки. Сильный порядок, который позволяет легко заполнить ваш пользовательский интерфейс данными, полученными асинхронно из сети. Инструменты отладки и трассировки.

Вы можете отправить запрос http / https так просто:

  // Instantiate the RequestQueue. RequestQueue queue = Volley.newRequestQueue(this); String url ="http://www.yourapi.com"; JsonObjectRequest request = new JsonObjectRequest(url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { if (null != response) { try { //handle your response } catch (JSONException e) { e.printStackTrace(); } } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }); queue.add(request); 

В этом случае вам не нужно учитывать «бег в фоновом режиме» или «использование кеша», так как все это уже сделано Volley.

Для меня самый простой способ – использовать библиотеку под названием Retrofit2

Нам просто нужно создать интерфейс, содержащий наш метод запроса, параметры, а также мы можем создать настраиваемый заголовок для каждого запроса:

  public interface MyService { @GET("users/{user}/repos") Call<List<Repo>> listRepos(@Path("user") String user); @GET("user") Call<UserDetails> getUserDetails(@Header("Authorization") String credentials); @POST("users/new") Call<User> createUser(@Body User user); @FormUrlEncoded @POST("user/edit") Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last); @Multipart @PUT("user/photo") Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description); @Headers({ "Accept: application/vnd.github.v3.full+json", "User-Agent: Retrofit-Sample-App" }) @GET("users/{username}") Call<User> getUser(@Path("username") String username); } 

И самое лучшее, мы можем сделать это асинхронно с помощью метода enqueue