Android使用Apache HttpClient发送GET、POST支持https的请求

 虽然HttpClient早已被废弃了,公司的项目仍然一直使用的开源组织pache的包,下面来说一下使用HttpClient的使用步骤:

1,创建HttpClient对象
2,如果要发送GET请求,创建HttpGet对象;如果是POST请求,则创建HttpPost对象。
3,如果需要添加参数,对于HttpGet直接在构造URL的时候填入参数。对于POST请求,使用setEntity(HttpEntity entity)方法来设置
4,调用HttpClient对象的execute(HttpUriRequest request)发送请求,此方法返回一个HttpResponse
5,调用HttpResponse的getALLHeaders()、getHeaders(String name)等方法可获取服务器响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器响应内容。

目前想使用Apache的包,有两种方法
1,使用android api小于23,因为在android 6.0及以后谷歌已经废弃Apache的包
2,在build.gradle文件中配置
defaultConfig {
useLibrary ‘org.apache.http.legacy’
}
下面是使用代码
public class HttpsClientUtil
{
private static HttpClient httpClient;

public static ResultEntity postByHttps(
String url,
String data )
{
HttpResponse response = null;
ResultEntity resultEntity = new ResultEntity();
try
{
byte[] byteData = data.getBytes();//byte字节传上送
ByteArrayEntity entity = new ByteArrayEntity( byteData );
HttpPost httpPost = new HttpPost( url );
httpPost.setEntity( entity );
HttpClient httpClient = creatHttpsClient();
response = httpClient.execute( httpPost );
if( response != null )
{
resultEntity.responseCode = response.getStatusLine().getStatusCode();
HttpEntity httpEntity = response.getEntity();
byte[] resultData = EntityUtils.toByteArray( httpEntity );
String resultStr = new String( resultData );
if( resultStr != null )
{
resultEntity.content = resultStr;
resultEntity.exception = null;
}
}
else
{
resultEntity.content = null;
resultEntity.exception = new Exception( ” respone is null” );
}
}
catch( Exception e )
{
if( response != null )
{
resultEntity.responseCode = response.getStatusLine().getStatusCode();
}
resultEntity.exception = e;
}
return resultEntity;
}

public static synchronized HttpClient creatHttpsClient()
{
if( httpClient == null )
{
try
{
HttpParams params = new BasicHttpParams();
// 设置一些基本参数
HttpProtocolParams.setVersion( params, HttpVersion.HTTP_1_1 );
HttpProtocolParams.setContentCharset( params, HTTP.UTF_8 );
HttpProtocolParams.setUseExpectContinue( params, true );
HttpProtocolParams.setUserAgent( params, “Android 2.2.1” );
// 超时设置
/* 从连接池中取连接的超时时间 */
ConnManagerParams.setTimeout( params, 30000 );
HttpConnectionParams.setConnectionTimeout( params, 30000 );
HttpConnectionParams.setSoTimeout( params, 30000 );
KeyStore trustStore = null;
trustStore = KeyStore.getInstance( KeyStore.getDefaultType() );
trustStore.load( null, null );
SSLSocketFactory sf = new MySSLSocketFactory( trustStore );
SchemeRegistry schReg = new SchemeRegistry();
schReg.register( new Scheme( “http”, PlainSocketFactory.getSocketFactory(), 80 ) );
// schReg.register( new Scheme( “https”, SSLSocketFactory.getSocketFactory(), 443 ) );
schReg.register( new Scheme( “https”, sf, 443 ) );
// 使用线程安全的连接管理来创建HttpClient
ClientConnectionManager conMgr = new ThreadSafeClientConnManager( params, schReg );
httpClient = new DefaultHttpClient( conMgr, params );
}
catch( KeyStoreException e )
{
e.printStackTrace();
}
catch( CertificateException e )
{
e.printStackTrace();
}
catch( NoSuchAlgorithmException e )
{
e.printStackTrace();
}
catch( IOException e )
{
e.printStackTrace();
}
catch( UnrecoverableKeyException e )
{
e.printStackTrace();
}
catch( KeyManagementException e )
{
e.printStackTrace();
}
}
return httpClient;
}

public static class ResultEntity
{
public int responseCode;
public Exception exception;
public String content;
}

private static class MySSLSocketFactory extends SSLSocketFactory
{
SSLContext sslContext = SSLContext.getInstance( “TLS” );

  public MySSLSocketFactory( KeyStore truststore ) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException
  {
     super( truststore );
     TrustManager tm = new X509TrustManager()
     {
        public void checkClientTrusted(
              X509Certificate[] chain,
              String authType ) throws CertificateException
        {
        }

        public void checkServerTrusted(
              X509Certificate[] chain,
              String authType ) throws CertificateException
        {
        }

        public X509Certificate[] getAcceptedIssuers()
        {
           return null;
        }
     };
     sslContext.init( null, new TrustManager[]{ tm }, null );
  }

  @Override
  public Socket createSocket(
        Socket socket,
        String host,
        int port,
        boolean autoClose ) throws IOException, UnknownHostException
  {
     return sslContext.getSocketFactory().createSocket( socket, host, port, autoClose );
  }

  @Override
  public Socket createSocket() throws IOException
  {
     return sslContext.getSocketFactory().createSocket();
  }

}

猜你喜欢

转载自blog.csdn.net/believeinbelieve/article/details/53289379