Сделайте HTTP-запрос с android
Я искал везде но не мог найти ответа, есть ли способ сделать простой HTTP-запрос? Я хочу запросить PHP-страницу / скрипт на одном из моих веб-сайтов, но я не хочу показывать веб-страницу.
Если возможно, я даже хочу сделать это в фоновом режиме (в BroadcastReceiver)
11 ответов:
обновление
это очень старый ответ. Я определенно не буду рекомендовать клиент Apache больше. Вместо этого используйте либо:
Оригинальный Ответ
прежде всего, запросите разрешение на доступ к сети, добавьте в свой манифест следующее:
<uses-permission android:name="android.permission.INTERNET" />тогда самый простой способ-использовать Apache http client в комплекте с 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.. } }посмотреть документация для получения дополнительной информации об обработке ответов и публикации запросы.
самый простой способ-использовать 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.
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:)
построить.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();
Я сделал это для веб-сервиса для запроса по 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является устаревшим и не может быть доступен, как это было в моем случае.Сначала добавьте две зависимости в сборку.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 }
для меня самый простой способ-использовать библиотеку под названием 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
поскольку ни один из ответов не описал способ выполнения запросов с OkHttp, который является очень популярным http-клиентом в настоящее время для Android и Java в целом, я приведу простой пример:
//get an instance of the client OkHttpClient client = new OkHttpClient(); //add parameters HttpUrl.Builder urlBuilder = HttpUrl.parse("https://www.example.com").newBuilder(); urlBuilder.addQueryParameter("query", "stack-overflow"); String url = urlBuilder.build().toString(); //build the request Request request = new Request.Builder().url(url).build(); //execute Response response = client.newCall(request).execute();явным преимуществом этой библиотеки является то, что она абстрагирует нас от некоторых деталей низкого уровня, обеспечивая более дружественные и безопасные способы взаимодействия с ними. Синтаксис также упрощен и позволяет писать хороший код.
Comments