HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。
使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。 1. 创建HttpClient对象。 2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。 3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。 4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttPResponse。 5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。 6. 释放连接。无论执行方法是否成功,都必须释放连接
有些博文使用了 org.apache.commons.httpclient.HttpClient ,有些博文用org.apache.http.client.HttpClient 类。原来,httpclient本来是属于apache-commons 项目下的一个子项目,后来是由Apache HttpComponents项目开发了后面的版本以提供更好的性能和更大的灵活性。commons下的这个httpclient最高版本是目前的3.1,支持HTTP协议1.1,继承了java.net.urlConnection,已经足够提供目前测试的大部分rest服务接口,本文介绍一下用法。这里可以查看所有的API - http://hc.apache.org/httpclient-3.x/apidocs/overview-summary.html
但是这里注意的是在Android新版本的API里已经不再集成HttpClient了。不再提供org.apache.http.* 解决方法 1.eclipse: libs中加入 org.apache.http.legacy.jar 上面的jar包在:**/android-sdk-windows/platforms/android-23/optional下(需要下载android 6.0的SDK) 2.android studio: 在相应的module下的build.gradle中加入: android { useLibrary ‘org.apache.http.legacy’ }注意放置的位置:是在android {}中
get方法获取数据
private void HttpClientGet(){ Log.d(TAG_STRING,"getMethod"); new Thread(new Runnable() { @Override public void run() { try { String line = null; //用于存储数据结果 StringBuffer sb = new StringBuffer(); //得到HttpClient对象 HttpClient getClient = new DefaultHttpClient(); //得到HttpGet对象 HttpGet request = new HttpGet(uri); //客户端使用GET方式执行请教,获得服务器端的回应response HttpResponse response = getClient.execute(request); //判断请求是否成功 if(response.getStatusLine().getStatusCode()== HttpStatus.SC_OK){ Log.d(TAG_STRING, "请求服务器端成功"); //注意getEntity方法只能被调用一次,多次调用会报Content has been consumed异常 //Log.d(TAG_STRING,EntityUtils.toString(response.getEntity())); //获得输入流 InputStream inStrem = response.getEntity().getContent(); BufferedReader br = new BufferedReader(new InputStreamReader(inStrem)); while ((line = br.readLine())!=null){ sb.append(line); } // Log.d(TAG_STRING,sb.toString()); //关闭输入流 inStrem.close(); }else { Log.d(TAG_STRING, "请求服务器端失败"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); }此处应注意 getEntity方法只能被调用一次,多次调用会报Content has been consumed异常,解决方法是提前在本地创建一个对象把它存储起来。
package com.example.a20256790.httpclientdemo;import android.os.Bundle;import android.util.Log;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.NameValuePair;import org.apache.http.client.HttpClient;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.List;import android.app.Activity;import org.apache.http.HttpVersion;import org.apache.http.params.BasicHttpParams;import org.apache.http.params.HttpConnectionParams;import org.apache.http.params.HttpParams;import org.apache.http.params.HttpProtocolParams;import org.apache.http.protocol.HTTP;import java.io.IOException;public class MainActivity extends Activity { final String URL_GET = "https://www.baidu.com"; final String URL_POST = "https://www.baidu.com"; final String TAG = "zoky"; final String userName = "zoky"; final String userPass = "1234"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getDataOnInternet(); } private void getDataOnInternet() { new Thread(new Runnable() { @Override public void run() { // doGet(URL_GET); doPost(URL_POST); } }).start(); } private HttpClient createHttpClient() { HttpParams mDefaultHttpParams = new BasicHttpParams(); //连接超时 HttpConnectionParams.setConnectionTimeout(mDefaultHttpParams, 15000); //请求超时 HttpConnectionParams.setSoTimeout(mDefaultHttpParams, 15000); HttpConnectionParams.setTcpNoDelay(mDefaultHttpParams, true); HttpProtocolParams.setVersion(mDefaultHttpParams, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(mDefaultHttpParams, HTTP.UTF_8); HttpProtocolParams.setUseExpectContinue(mDefaultHttpParams, true); //创建HttpClient客户端 HttpClient mHttpClient = new DefaultHttpClient(mDefaultHttpParams); return mHttpClient; } private void doGet(String url) { HttpGet mHttpGet = new HttpGet(url); mHttpGet.addHeader("Connection", "Keep-Alive"); try { HttpClient mHttpClient = createHttpClient(); HttpResponse mHttpResponse = mHttpClient.execute(mHttpGet); HttpEntity mHttpEntity = mHttpResponse.getEntity(); int code = mHttpResponse.getStatusLine().getStatusCode(); if (null != mHttpEntity) { InputStream mInputStream = mHttpEntity.getContent(); String respose = InputStreamToString(mInputStream); Log.i(TAG, "StatusCode:" + code + " result:/n" + respose); mInputStream.close(); } else { Log.d(TAG,"请求服务器失败"); } } catch (IOException e) { e.printStackTrace(); } } private void doPost(String url) { HttpPost mHttpPost = new HttpPost(url); mHttpPost.addHeader("Connection", "Keep-Alive"); try { HttpClient mHttpClient = createHttpClient(); List<NameValuePair> postParams = new ArrayList<>(); //要传递的参数 postParams.add(new BasicNameValuePair("username", "moon")); postParams.add(new BasicNameValuePair("passWord", "123")); mHttpPost.setEntity(new UrlEncodedFormEntity(postParams)); HttpResponse mHttpResponse = mHttpClient.execute(mHttpPost); HttpEntity mHttpEntity = mHttpResponse.getEntity(); int code = mHttpResponse.getStatusLine().getStatusCode(); if (null != mHttpEntity) { InputStream mInputStream = mHttpEntity.getContent(); String respose = InputStreamReader(mInputStream); Log.i(TAG, "StatusCode:" + code + " 请求结果:/n" + respose); mInputStream.close(); } else { Log.d(TAG,"请求服务器失败"); } } catch (IOException e) { e.printStackTrace(); } } private String InputStreamToString(InputStream is) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuffer sb = new StringBuffer(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "/n"); } String respose = sb.toString(); return respose; }}返回结果:
以上就是HttpClient的简单使用方法,但是Android官方已经不再推荐用HttpClient进行Android应用的网络通信了,以上很多方法都已经过时,因此,在开发项目时更加推荐使用最新开源的网络框架,如OKHttp、Restrofit等。
参考博客:采用HttpClient的POST方式、GET方式分别实现登陆案例
新闻热点
疑难解答