天天看点

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();
  }
           

}