Net开源应用技术干货

Android--简阅(3):使用Bmob Restful AP

2017-04-18  本文已影响118人  老鱼的储物柜

刚开始使用的是Bmob提供的SDK,后来想着网络层自己去写,也打算使用写一个简单的后台。

使用Restful API,我直接在Bmob后台数据库添加了一张表,接上一章实现引导页的广告。
直接导入一串json数据

[
    {"picture":"http://rain0413.oss-cn-qingdao.aliyuncs.com/images/snsd.jpg","url":"http://www.dailylifeapp.com/home/home.html"},
    {"picture":"http://rain0413.oss-cn-qingdao.aliyuncs.com/images/war3.jpg","url":"http://www.dailylifeapp.com/home/home.html"},
    {"picture":"http://rain0413.oss-cn-qingdao.aliyuncs.com/images/war5.jpg","url":"http://www.dailylifeapp.com/home/home.html"}
    ]

使用GsonFormat生成一个实体类(方便、偷懒)

public class SpalshAdvertInfo implements Serializable{

    private String picture;
    private String url;

    public String getPicture() {
        return picture;
    }

    public void setPicture(String picture) {
        this.picture = picture;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}

网络请求:

        OkHttpUtils.get().url("https://api.bmob.cn /1/schemas/splash_advert")
                .addHeader("X-Bmob-Application-Id","X-Bmob-Application-Id")
                .addHeader("X-Bmob-REST-API-Key","X-Bmob-REST-API-Key")
                .enqueue(new GsonResponseHandler(this, SpalshAdvertInfo.class));

这里请求头看官方文档介绍,就不做过多解释。

运行后结果报错...

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

好吧,这是https请求,需要获得证书
这里有俩种处理方法,第一信任所有证书(不安全,不推荐)第二就是使用证书呗...

好了,接下来做的就是获取证书,用360急速浏览器...
打开https://api.bmob.cn/ 点击安全锁查看证书信息

QQ截图20170410223612.png

点击详细信息-复制到文件 一直下一步,命名为bmob.cer,将其放到assets目录下。
然后写一个https验证工具类

/**
* https验证工具类
* Created by Administrator on 2017/4/10 0010.
*/
public class HttpsUtils {
   //使用命令keytool -printcert -rfc -file srca.cer 导出证书为字符串,然后将字符串转换为输入流,

   public static class SSLParams {
       public SSLSocketFactory sSLSocketFactory;
       public X509TrustManager trustManager;
   }

   /**
    * 返回SSLSocketFactory
    *
    * @param certificates 证书的输入流
    * @return SSLSocketFactory
    */
   public static SSLParams getSSLSocketFactory(InputStream... certificates) {
       return getSSLSocketFactory(null, certificates);
   }


   /**
    * 双向认证
    *
    * @param keyManagers  KeyManager[]
    * @param certificates 证书的输入流
    * @return SSLSocketFactory
    */
   public static SSLParams getSSLSocketFactory(KeyManager[] keyManagers, InputStream... certificates) {

       SSLParams sslParams = new SSLParams();

       try {
           CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
           KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
           keyStore.load(null);
           int index = 0;
           for (InputStream certificate : certificates) {
               String certificateAlias = Integer.toString(index++);
               keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));
               try {
                   if (certificate != null)
                       certificate.close();
               } catch (IOException e) {
               }
           }
           SSLContext sslContext = SSLContext.getInstance("TLS");
           TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
           trustManagerFactory.init(keyStore);
           sslContext.init(keyManagers, trustManagerFactory.getTrustManagers(), new SecureRandom());
           sslParams.sSLSocketFactory = sslContext.getSocketFactory();
           return sslParams;
       } catch (Exception e) {
           e.printStackTrace();
       }
       return null;
   }


   /**
    * 获得双向认证所需的参数
    *
    * @param bks          bks证书的输入流
    * @param keystorePass 秘钥
    * @return KeyManager[]对象
    */
   public static KeyManager[] getKeyManagers(InputStream bks, String keystorePass) {
       KeyStore clientKeyStore = null;
       try {
           clientKeyStore = KeyStore.getInstance("BKS");
           clientKeyStore.load(bks, keystorePass.toCharArray());
           KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
           keyManagerFactory.init(clientKeyStore, keystorePass.toCharArray());
           KeyManager[] keyManagers = keyManagerFactory.getKeyManagers();
           return keyManagers;
       } catch (KeyStoreException e) {
           e.printStackTrace();
       } catch (UnrecoverableKeyException e) {
           e.printStackTrace();
       } catch (CertificateException e) {
           e.printStackTrace();
       } catch (NoSuchAlgorithmException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       }
       return null;
   }

   /**
    * 忽略所有https证书
    *
    * @return
    */
   public static SSLParams createSSLSocketFactory() {
       SSLParams sslParams = new SSLParams();


       final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
           @Override
           public void checkClientTrusted(
                   X509Certificate[] chain,
                   String authType) throws CertificateException {
           }

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

           @Override
           public X509Certificate[] getAcceptedIssuers() {
               X509Certificate[] x509Certificates = new X509Certificate[0];
               return x509Certificates;
           }
       }};
       try {
           SSLContext sslContext = SSLContext.getInstance("TLS");
           sslContext.init(null, trustAllCerts, new SecureRandom());
           sslParams.sSLSocketFactory = sslContext.getSocketFactory();
           return sslParams;
       } catch (Exception e) {
       }
       return null;
   }
}

详见OkHttp封装 :传送门
这里参考使用鸿洋大神写的 Android Https相关完全解析 当OkHttp遇到Https

上一篇 下一篇

猜你喜欢

热点阅读