我到处搜索但我找不到答案,有没有办法发出简单的HTTP请求?我想在我的某个网站上请求PHP页面/脚本,但我不想显示该网页 .
如果可能的话我甚至想在后台(在BroadcastReceiver中)这样做
这是一个非常古老的答案 . 我绝对不会再推荐Apache的客户了 . 而是使用:
OkHttp
HttpUrlConnection
首先,请求访问网络的权限,在清单中添加以下内容:
<uses-permission android:name="android.permission.INTERNET" />
那么最简单的方法是使用与Android捆绑的Apache http客户端:
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
注意:现在不推荐使用与Android捆绑在一起的Apache HTTP Client,而使用HttpURLConnection . 有关详细信息,请参阅Android开发人员Blog .
将 <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请求的更多信息,请参阅documentation .
最简单的方法是使用名为Volley的Android库
Volley提供以下好处:自动调度网络请求 . 多个并发网络连接 . 具有标准HTTP缓存一致性的透明磁盘和内存响应缓存 . 支持请求优先级 . 取消请求API . 您可以取消单个请求,也可以设置要取消的请求块或范围 . 易于定制,例如,重试和退避 . 强大的排序功能,可以使用从网络异步获取的数据轻松正确填充UI . 调试和跟踪工具 .
您可以像这样简单地发送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获得的真棒新库:)
build.gradle: compile 'com.apptakk.http_request:http-request:0.1.2'
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
我使用Gson lib为web服务创建了这个URL:
客户:
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; }
这是android中HTTP Get / POST请求的新代码 . HTTPClient 已被删除,可能无法使用,就像我的情况一样 .
HTTPClient
首先在build.gradle中添加两个依赖项:
compile 'org.apache.httpcomponents:httpcore:4.4.1' compile 'org.apache.httpcomponents:httpclient:4.5'
然后在 ASyncTask 中以 doBackground 方法编写此代码 .
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执行请求的方法,这对于Android和Java来说是非常流行的http客户端,我将提供一个简单的例子:
//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();
这个库的明显优势在于它从一些低级细节中抽象出我们,提供了更友好和安全的方式来与它们进行交互 . 语法也简化了,允许编写漂亮的代码 .
11 回答
更新
这是一个非常古老的答案 . 我绝对不会再推荐Apache的客户了 . 而是使用:
OkHttp
HttpUrlConnection
原始答案
首先,请求访问网络的权限,在清单中添加以下内容:
那么最简单的方法是使用与Android捆绑的Apache http客户端:
如果你想让它在单独的线程上运行,我建议扩展AsyncTask:
然后您可以通过以下方式提出请求:
除非您有明确的理由选择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
注意:现在不推荐使用与Android捆绑在一起的Apache HTTP Client,而使用HttpURLConnection . 有关详细信息,请参阅Android开发人员Blog .
将
<uses-permission android:name="android.permission.INTERNET" />
添加到清单中 .然后,您将检索如下所示的网页:
我还建议在一个单独的线程上运行它:
有关响应处理和POST请求的更多信息,请参阅documentation .
最简单的方法是使用名为Volley的Android库
您可以像这样简单地发送http / https请求:
在这种情况下,您不必考虑自己“在后台运行”或“使用缓存”,因为所有这些都已由Volley完成 .
问候
有一个线程:
看看这个可以通过gradle获得的真棒新库:)
build.gradle:
compile 'com.apptakk.http_request:http-request:0.1.2'
用法:
https://github.com/erf/http-request
我使用Gson lib为web服务创建了这个URL:
客户:
这是android中HTTP Get / POST请求的新代码 .
HTTPClient
已被删除,可能无法使用,就像我的情况一样 .首先在build.gradle中添加两个依赖项:
然后在
ASyncTask
中以doBackground
方法编写此代码 .对我来说,最简单的方法是使用名为Retrofit2的库
我们只需要创建一个包含我们的请求方法,参数的接口,并且我们也可以为每个请求创建自定义标头:
最好的是,我们可以使用enqueue方法轻松地异步进行
由于没有一个答案描述了使用OkHttp执行请求的方法,这对于Android和Java来说是非常流行的http客户端,我将提供一个简单的例子:
这个库的明显优势在于它从一些低级细节中抽象出我们,提供了更友好和安全的方式来与它们进行交互 . 语法也简化了,允许编写漂亮的代码 .