使用Retrofit进行Http、Https网络请求(快速上手)
2017-11-09 15:55
851 查看
1.配置gradle
//注解包 compile 'com.jakewharton:butterknife:7.0.0' //Retrofit2所需要的包//这里需要值得注意的是导入的retrofit2包的版本必须要一致,否则就会报错compile 'com.squareup.retrofit2:retrofit:2.0.0' //ConverterFactory的Gson依赖包 compile 'com.squareup.retrofit2:converter-gson:2.0.0'
2.先使用http进行网络请求,这里我使用的是百度API的手机号码归属地查询的接口(点这里)
初始化Retrofitprivate static final String BASE_URL = "http://apis.baidu.com"; private static final String API_KEY = "b90f262a4f321bb6755157bf1915b4f8"; //1.创建Retrofit对象 Retrofit retrofit = new Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create())//增加返回值为Gson的支持(以实体类返回) .baseUrl(BASE_URL)//主机地址 .build();
根据返回的json数据格式使用GsonFormat一键生成JavaBean(这个大家应该都会,AS常用的工具),最终结果如下:
public class PhoneResult { /** * errNum : 0 * retMsg : success * retData : {"phone":"15210011578","prefix":"1521001","supplier":"移动","province":"北京","city":"北京","suit":"152卡"} */ private int errNum; private String retMsg; private RetDataEntity retData; public void setErrNum(int errNum) { this.errNum = errNum; } public void setRetMsg(String retMsg) { this.retMsg = retMsg; } public void setRetData(RetDataEntity retData) { this.retData = retData; } public int getErrNum() { return errNum; } public String getRetMsg() { return retMsg; } public RetDataEntity getRetData() { return retData; } public static class RetDataEntity { /** * phone : 15210011578 * prefix : 1521001 * supplier : 移动 * province : 北京 * city : 北京 * suit : 152卡 */ private String phone; private String prefix; private String supplier; private String province; private String city; private String suit; public void setPhone(String phone) { this.phone = phone; } public void setPrefix(String prefix) { this.prefix = prefix; } public void setSupplier(String supplier) { this.supplier = supplier; } public void setProvince(String province) { this.province = province; } public void setCity(String city) { this.city = city; } public void setSuit(String suit) { this.suit = suit; } public String getPhone() { return phone; } public String getPrefix() { return prefix; } public String getSupplier() { return supplier; } public String getProvince() { return province; } public String getCity() { return city; } public String getSuit() { return suit; } } }定义请求的API
public interface PhoneService { @GET("/apistore/mobilenumber/mobilenumber") //是方法Url //@Query**(“phone”)来设定body的parameters. Call<PhoneResult> getResult(@Header("apikey") String apikey, @Query("phone") String phone); }调用API
//这里采用的是Java的动态代理模式 PhoneService service = retrofit.create(PhoneService.class); //传入我们请求的键值对的值,mPhoneEt是我们输入的手机号 Call<PhoneResult> call = service.getResult(API_KEY, mPhoneEt.getText().toString());
发送请求
call.enqueue(new Callback<PhoneResult>() { @Override public void onResponse(Call<PhoneResult> call, Response<PhoneResult> response) { //处理结果 if (response.isSuccessful()) { PhoneResult result = response.body(); if (result != null) { if (result.getRetMsg() != null) { mAddressTv.setText(result.getRetMsg());//设置显示到texiview上 } else { PhoneResult.RetDataEntity entity = result.getRetData(); mAddressTv.setText(entity.getProvince()); } } } } @Override public void onFailure(Call<PhoneResult> call, Throwable t) { } });
看下结果
![](http://upload-images.jianshu.io/upload_images/2120096-273d372e50673798.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最终结果
3.使用https进行网络请求
将证书拷贝到raw目录下![](http://upload-images.jianshu.io/upload_images/2120096-dbf6764b18e4b215.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
https请求服务器需要的证书都知道Retrofit的网络请求是使用okhttp,所以我们只需要给
OkHttpClient.Builder().sslSocketFactory(sslSocketFactory),那么SSLSocketFactory怎么得到呢,哈哈,不要急,方法已经写好:
public class SslContextFactory { private static final String CLIENT_TRUST_PASSWORD = "changeit";//信任证书密码,该证书默认密码是changeit private static final String CLIENT_AGREEMENT = "TLS";//使用协议 private static final String CLIENT_TRUST_MANAGER = "X509"; private static final String CLIENT_TRUST_KEYSTORE = "BKS"; SSLContext sslContext = null; public SSLContext getSslSocket() { try { //取得SSL的SSLContext实例 sslContext = SSLContext.getInstance(CLIENT_AGREEMENT); //取得TrustManagerFactory的X509密钥管理器实例 TrustManagerFactory trustManager = TrustManagerFactory.getInstance(CLIENT_TRUST_MANAGER); //取得BKS密库实例 KeyStore tks = KeyStore.getInstance(CLIENT_TRUST_KEYSTORE); InputStream is = MyApplication.getInstance().getResources().openRawResource(R.raw.suplcerts); try { tks.load(is, CLIENT_TRUST_PASSWORD.toCharArray()); } finally { is.close(); } //初始化密钥管理器 trustManager.init(tks); //初始化SSLContext sslContext.init(null, trustManager.getTrustManagers(), null); } catch (Exception e) { Log.e("SslContextFactory", e.getMessage()); } return sslContext; }}
给OkHttpClient.Builder().sslSocketFactory(sslSocketFactory)
SSLSocketFactory sslSocketFactory = new SslContextFactory().getSslSocket().getSocketFactory(); OkHttpClient.Builder okHttpClient = new OkHttpClient.Builder().sslSocketFactory(sslSocketFactory);
创建Retrofit对象
Retrofit retrofit = new Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create())//增加返回值为Gson的支持(以实体类返回) .baseUrl("https://skyish-test.yunext.com")//主机地址 .client(okHttpClient.build()) /注意这里要给retrofit 设置okhttpclient .build();
后面的创建请求的API跟调用API跟上面的使用http请求是一样的,可以自己找个接口试试,亲测,没有问题,这里我就不贴代码了。
作者:起个牛逼的昵称
链接:http://www.jianshu.com/p/9a6c204616d2
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关文章推荐
- 使用Retrofit进行Http、Https网络请求(快速上手)
- Swift - 使用SwiftHTTP通过HTTPS进行网络请求,及证书的使用
- iOS-使用NSURLConnection进行Http Get和Post请求网络数据
- 还不会使用OkHttp和Retrofit进行Android网络请求?看看这篇你就会了!
- 使用afnetworking和网络服务接口及soap发送并接收http/https请求:
- Swift - 使用Alamofire通过HTTPS进行网络请求,及证书的使用
- Android中使用Volley开源库进行Http网络请求(GET方式)
- 升级为iOS9后,默认请求类型为https,如何使用http进行请求会报错(引用他人的)
- 超级简单的retrofit使用自签名证书进行HTTPS请求的教程
- 超级简单的retrofit使用自签名证书进行HTTPS请求的教程
- 使用burpsuite监控设备(如ios,android)网络http,https请求
- Android中使用Volley开源库进行Http网络请求(GET方式)
- 超级简单的retrofit使用自签名证书进行HTTPS请求的教程
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
- 使用Retrofit进行网络请求
- AndroidStudio下使用Retrofit进行网络请求
- 使用Http进行网络请求
- iOS开发工具-如何使用网络封包分析工具Charles,通过配置proxy对http、https、tcp、udp 等协议的请求响应过程交互信息进行分析、判断、解决我们移动开发中的遇到的各种实际问题。
- [置顶] Retrofit与OkHttp进行HTTP网络编程使用指南
- 使用mockwebserver对http与https进行网络测试