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/ 点击安全锁查看证书信息
![](https://img.haomeiwen.com/i548993/e53c787f67c057da.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