我到处都找过了,但我找不到我的答案,有没有一种方法可以做一个简单的HTTP请求?我想在我的一个网站上请求一个PHP页面/脚本,但我不想显示网页。
如果可能的话,我甚至想在后台(在一个BroadcastReceiver)做它
有一根线:
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); } }
这是一个非常古老的答案。我绝对不会再推荐Apache的客户端了。你可以用任意一种:
首先,申请访问网络的权限,在您的清单中添加以下内容:
<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上讨论过权衡
我做了这个webservice请求URL,使用一个Gson库:
客户:
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; }
private String getToServer(String service) throws IOException { HttpGet httpget = new HttpGet(service); ResponseHandler<String> responseHandler = new BasicResponseHandler(); return new DefaultHttpClient().execute(httpget, responseHandler); }
问候
注意:与Android捆绑的Apache HTTP客户端现在已弃用,转而支持HttpURLConnection。更多细节请参见Android Developers 博客。
将<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请求的更多信息,请参阅文档。
这是android中HTTP Get/POST请求的新代码。HTTPClient已被废弃,可能无法使用,因为在我的情况下。
HTTPClient
首先在build.gradle中添加两个依赖:
compile 'org.apache.httpcomponents:httpcore:4.4.1' compile 'org.apache.httpcomponents:httpclient:4.5'
然后用doBackground方法在ASyncTask中编写此代码。
doBackground
ASyncTask
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 }
看看这个很棒的新库,它可以通过gradle获得:)
构建。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
对我来说,最简单的方法是使用名为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方法轻松地进行异步操作
最简单的方法是使用名为凌空抽射的Android库
Volley有以下好处: 网络请求自动调度。多个并发网络 < / >强的联系。透明磁盘和内存响应缓存 标准HTTP缓存一致性。支持请求优先级。 取消请求API。您可以取消单个请求,也可以 设置要取消的请求块或范围。便于定制,便于 例如,重试和回退。强有序使它很容易 方法异步获取的数据正确地填充UI 网络。 .调试跟踪工具
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。
由于没有一个答案描述了一种使用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();
这个库的明显优势是,它将我们从一些低级细节中抽象出来,提供了更友好和安全的方式与它们交互。语法也被简化,允许编写漂亮的代码。
按照上面的建议使用凌空射击。添加以下到构建。gradle(模块:app)
implementation 'com.android.volley:volley:1.1.1'
在AndroidManifest.xml中添加以下内容:
并添加以下活动代码:
public void httpCall(String url) { RequestQueue queue = Volley.newRequestQueue(this); StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String response) { // enjoy your response } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // enjoy your error status } }); queue.add(stringRequest); }
它取代了http客户端,非常简单。