Android Https通讯

Android Https通信
https与http的通信,在我看来主要的区别在于https多了一个安全验证机制,而Android采用的是X509验证,首先我们需要这重写X509类,建立我们的验证规则、、不过对于特定的项目,我们一般都是无条件信任服务端的,因此我们可以对任何证书都无条件信任(其实本质上我们只是信任了特定url的证书,为了偷懒,才那么选择的)/**
 * 信任所有主机-对于任何证书都不做检查
 */
class MytmArray implements X509TrustManager {
    public X509Certificate[] getAcceptedIssuers() {
        // return null;
        return new X509Certificate[] {};
    }

    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType)
            throws CertificateException {
        // TODO Auto-generated method stub

    }

    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType)
            throws CertificateException {
        // TODO Auto-generated method stub
        // System.out.println("cert: " + chain[0].toString() + ", authType: "
        // + authType);
    }
};
 好了,我们写好了信任规则,接下载就要创建一个主机的信任列表
static TrustManager[] xtmArray = new MytmArray[] { new MytmArray() };

    /**
     * 信任所有主机-对于任何证书都不做检查
     */
    private static void trustAllHosts() {
        // Create a trust manager that does not validate certificate chains
        // Android 采用X509的证书信息机制
        // Install the all-trusting trust manager
        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, xtmArray, new java.security.SecureRandom());
            HttpsURLConnection
                    .setDefaultSSLSocketFactory(sc.getSocketFactory());
            // HttpsURLConnection.setDefaultHostnameVerifier(DO_NOT_VERIFY);//
            // 不进行主机名确认
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            // TODO Auto-generated method stub
            // System.out.println("Warning: URL Host: " + hostname + " vs. "
            // + session.getPeerHost());
            return true;
        }
    };
 上面的都是https通信需要做的几个基本要求,接下载我们要做的就是https的使用啦下面就以get和post为例进行说明,中间还涉及到cookie的使用
String httpUrl="XXXXX"
String result = "";
        HttpURLConnection http = null;
        URL url;
        try {
            url = new URL(httpUrl);
            // 判断是http请求还是https请求
            if (url.getProtocol().toLowerCase().equals("https")) {
                trustAllHosts();
                http = (HttpsURLConnection) url.openConnection();
                ((HttpsURLConnection) http).setHostnameVerifier(DO_NOT_VERIFY);// 不进行主机名确认

            } else {
                http = (HttpURLConnection) url.openConnection();
            }
            http.setConnectTimeout(10000);// 设置超时时间
            http.setReadTimeout(50000);
            http.setRequestMethod("GET");// 设置请求类型为
            http.setDoInput(true);
            http.setRequestProperty("Content-Type", "text/xml");
//http.getResponseCode());http或https返回状态200还是403
BufferedReader in = null;
            if (obj.getHttpStatus() == 200) {
                getCookie(http);
                in = new BufferedReader(new InputStreamReader(
                        http.getInputStream()));
            } else
                in = new BufferedReader(new InputStreamReader(
                        http.getErrorStream()));
            result = in.readLine();
            Log.i("result", result);
            in.close();
            http.disconnect();
 https或http的get请求写好了,哦中间涉及到了一个getCookie的方法,如下:
/** 得到cookie */
    private static void getCookie(HttpURLConnection http) {
        String cookieVal = null;
        String key = null;
        DataDefine.mCookieStore = "";
        for (int i = 1; (key = http.getHeaderFieldKey(i)) != null; i++) {
            if (key.equalsIgnoreCase("set-cookie")) {
                cookieVal = http.getHeaderField(i);
                cookieVal = cookieVal.substring(0, cookieVal.indexOf(";"));
                DataDefine.mCookieStore = DataDefine.mCookieStore + cookieVal
                        + ";";
            }
        }
    }
 public static Query HttpQueryReturnClass(String httpUrl, String base64) {
        String result = "";
        Log.i("控制", httpUrl);
        Query obj = new Query();
        HttpURLConnection http = null;
        URL url;
        try {
            url = new URL(httpUrl);
            // 判断是http请求还是https请求
            if (url.getProtocol().toLowerCase().equals("https")) {
                trustAllHosts();
                http = (HttpsURLConnection) url.openConnection();
                ((HttpsURLConnection) http).setHostnameVerifier(DO_NOT_VERIFY);// 不进行主机名确认
            } else {
                http = (HttpURLConnection) url.openConnection();
            }
            http.setConnectTimeout(10000);// 设置超时时间
            http.setReadTimeout(50000);
            http.setRequestMethod("POST");// 设置请求类型为post
            http.setDoInput(true);
            http.setDoOutput(true);
            http.setRequestProperty("Content-Type", "text/xml");
            http.setRequestProperty("Cookie", DataDefine.mCookieStore);
            DataOutputStream out = new DataOutputStream(http.getOutputStream());
            out.writeBytes(base64);
            out.flush();
            out.close();
            obj.setHttpStatus(http.getResponseCode());// 设置http返回状态200还是403
            BufferedReader in = null;
            if (obj.getHttpStatus() == 200) {
                getCookie(http);
                in = new BufferedReader(new InputStreamReader(
                        http.getInputStream()));
            } else
                in = new BufferedReader(new InputStreamReader(
                        http.getErrorStream()));
            result = in.readLine();// 得到返回结果
            in.close();
            http.disconnect();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}
 这里面的base64是我经过base64加密过以后的数据

 

转载于:https://www.cnblogs.com/qcgAd/p/5366594.html

OkHttp是一个广泛使用的开源HTTP客户端库,用于在Android应用程序中进行网络通信。它提供了简单而强大的API,可以用于执行同步和异步的HTTP请求。在你提供的引用中,有关于OkHttp的三个方面的内容,我将分别进行解释。 首先,你需要创建一个OkHttpClient对象。这个对象是OkHttp库的核心,用于管理和执行HTTP请求。你可以使用以下代码来创建OkHttpClient对象: ```java OkHttpClient okHttpClient = new OkHttpClient(); ``` 其次,你需要在Android程序中进行网络请求时,使用异步处理的方式。在Android中,网络请求必须在单独的线程中执行,以避免阻塞主线程。你可以使用以下代码来执行异步的GET请求: ```java new Thread(() -> { Request request = new Request.Builder().url("https://www.httpbin.org/get?name=test&b=123").build(); try { Response response = okHttpClient.newCall(request).execute(); Log.d(TAG, "doGetSync: " + response.body().string()); } catch (IOException e) { e.printStackTrace(); } }).start(); ``` 同时,你需要在AndroidManifest.xml文件中添加网络请求权限。这样才能确保你的应用程序有权限进行网络通信。你可以在`<manifest>`标签下添加以下代码: ```xml <uses-permission android:name="android.permission.INTERNET"/> ``` 综上所述,你可以在Android应用程序中使用OkHttp库进行网络通信。首先,创建一个OkHttpClient对象;然后,使用异步的方式执行GET请求;最后,在AndroidManifest.xml文件中添加网络请求权限。 希望能对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值