之前总结过Volley-OkHttp
今天来写写Retrofit的demo,简单封装下
Retrofit与okhttp共同出自于Square公司,retrofit就是对okhttp做了一层封装。把网络请求都交给给了Okhttp,我们只需要通过简单的配置就能使用retrofit来进行网络请求了,其主要作者是Android大神JakeWharton。
导包:
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'io.reactivex:rxjava:1.1.6'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
我通过http://apis.juhe.cn/mobile/get?phone=13429667914&key=safly这个进行测试
1、首先创建请求接口
interface PostClickAppInfoServerParameter {
@GET("mobile/get")
Call<HttpResultJuHe> getJuheResult(@Query("phone") String phone,
@Query("key") String key);
}
以上的phone、key是请求参数的键,返回一个Call泛型接口
2、配置Retrofit
protected RetrofitBase(){
retrofit = new Retrofit.Builder()
.baseUrl(BASEURL)
.client(client())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
}
private OkHttpClient client(){
LauncherTrust launcherTrust = new LauncherTrust();
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS)
.readTimeout(TIMEOUT,TimeUnit.MILLISECONDS)
.sslSocketFactory(sslSocketFactory(launcherTrust),launcherTrust)
.hostnameVerifier(new AllowAllHostnameVerifier())
.build();
return okHttpClient;
}
addConverterFactory和addCallAdapterFactory说明可以支持Gson、Rxjava,Retrofit是进一步封装了OkHttp的代码
3、得到Call的实例,发起请求
public void postClickAppInfoParameter(final MyCallback mCallback) {
FactoryInters.PostClickAppInfoServerParameter server = retrofit.create(FactoryInters.PostClickAppInfoServerParameter.class);
final Call<HttpResultJuHe> call = server.getJuheResult("13429667914", "safly");
call.enqueue(new Callback<HttpResultJuHe>() {
@Override
public void onResponse(final Call<HttpResultJuHe> call, final Response<HttpResultJuHe> response) {
Log.i(TAG, "response------------>" + response.body().toString());
retroHttpHandler.post(new Runnable() {
@Override
public void run() {
if (mCallback != null) {
mCallback.onSuccess(response.body());
if (call != null)
call.cancel();
}
}
});
}
@Override
public void onFailure(Call<HttpResultJuHe> call, Throwable t) {
String message = t.getMessage();
if (mCallback != null) {
mCallback.onFailture(message);
}
}
});
}
以上是添加请求参数的方法,请求参数还可以统一放在map中,以下的PostClickAppInfoParameterJsonBody是封装了请求体
public interface FactoryInters {
interface PostClickAppInfoServerParameter {
@GET("mobile/get")
Call<HttpResultJuHe> getJuheResult(@Query("phone") String phone,
@Query("key") String key);
}
interface PostClickAppInfoServerMap {
@GET("mobile/get")
Call<HttpResultJuHe> getJuheResult(@QueryMap Map<String, String> options);
}
///api/v1.0/DeletePrivateContact
interface PostClickAppInfoParameterJsonBody{
@Headers({"Content-Type: application/json","Accept: application/json"})
@POST("DeletePrivateContact")
Call<HttpResult> getJuheResult(@Body HttpRequest request);
}
}
让我们来看下测试请求http://apis.juhe.cn/mobile/get?phone=13429667914&key=safly的返回结果把:
HttpResultJuHe{resultcode='101', reason='错误的请求KEY!', result='null', error_code='10001'}
PostClickAppInfoServerMap这种方式是构建map集合如下:
public void postClickAppInfoParameterMap(final MyCallback mCallback) {
FactoryInters.PostClickAppInfoServerMap server = retrofit.create(FactoryInters.PostClickAppInfoServerMap.class);
Map<String, String> options = new HashMap<>();
options.put("phone", "13429667914");
options.put("key", "safly");
final Call<HttpResultJuHe> call = server.getJuheResult(options);
call.enqueue(new Callback<HttpResultJuHe>() {
@Override
public void onResponse(final Call<HttpResultJuHe> call, final Response<HttpResultJuHe> response) {
Log.i(TAG, "response------------>" + response.body().toString());
retroHttpHandler.post(new Runnable() {
@Override
public void run() {
if (mCallback != null) {
mCallback.onSuccess(response.body());
if (call != null)
call.cancel();
}
}
});
}
@Override
public void onFailure(Call<HttpResultJuHe> call, Throwable t) {
String message = t.getMessage();
if (mCallback != null) {
mCallback.onFailture(message);
}
}
});
}
postClickAppInfoParameterJsonBody
以下代码是构建请求体如下:
public void postClickAppInfoParameterJsonBody(final MyCallback mCallback) {
FactoryInters.PostClickAppInfoParameterJsonBody server = retrofit.create(FactoryInters.PostClickAppInfoParameterJsonBody.class);
ArrayList<String> contact_ids = new ArrayList<>();
contact_ids.add("1475920950100");
HttpRequest httpRequest = new HttpRequest();
httpRequest.setPhone_num("18612185929");
httpRequest.setImei("123456789012345");
httpRequest.setGodin_id("4c59396301ab6274bd7892f0b31df36e");
httpRequest.setContact_ids(contact_ids);
final Call<HttpResult> call = server.getJuheResult(httpRequest);
call.enqueue(new Callback<HttpResult>() {
@Override
public void onResponse(final Call<HttpResult> call, final Response<HttpResult> response) {
Log.i(TAG, "response------------>" + response.body().toString());
retroHttpHandler.post(new Runnable() {
@Override
public void run() {
if (mCallback != null) {
mCallback.onSuccess(response.body());
if (call != null)
call.cancel();
}
}
});
}
@Override
public void onFailure(Call<HttpResult> call, Throwable t) {
String message = t.getMessage();
if (mCallback != null) {
mCallback.onFailture(message);
}
}
});
}
———————以下是代码区—————————demo不传了代码直接贴了———————————-
配置文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.godinsec.db" >
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
封装Retrofit,内置OkHttp
RetrofitBase
package com.godinsec.db;
import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.concurrent.TimeUnit;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Created by Safly on 2016/9/13.
*/
public abstract class RetrofitBase {
private static final String BASEURL = "http://apis.juhe.cn/";
// private static final String BASEURL = "http://x-phone.cn/api/v1.0/";
private static final long TIMEOUT = 5 * 1000;
protected Retrofit retrofit;
protected RetrofitBase(){
retrofit = new Retrofit.Builder()
.baseUrl(BASEURL)
.client(client())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
}
private OkHttpClient client(){
LauncherTrust launcherTrust = new LauncherTrust();
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS)
.readTimeout(TIMEOUT,TimeUnit.MILLISECONDS)
.sslSocketFactory(sslSocketFactory(launcherTrust),launcherTrust)
.hostnameVerifier(new AllowAllHostnameVerifier())
.build();
return okHttpClient;
}
private SSLSocketFactory sslSocketFactory(LauncherTrust launcherTrust){
try {
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null,new TrustManager[]{launcherTrust},new SecureRandom());
return sslContext.getSocketFactory();
} catch (NoSuchAlgorithmException | KeyManagementException e) {
e.printStackTrace();
}
return null;
}
static class LauncherTrust implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
}
RetrofitManger
package com.godinsec.db;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import rx.Observable;
/**
* {"resultcode":"101","reason":"错误的请求KEY!","result":null,"error_code":10001}
*/
public class RetrofitManger extends RetrofitBase {
private static final String TAG = "RetrofitManger";
private Handler retroHttpHandler;
private RetrofitManger() {
super();
this.retroHttpHandler = new Handler(Looper.getMainLooper());
}
private static final class Factory {
private static final RetrofitManger instance = new RetrofitManger();
}
public static RetrofitManger getInstance() {
return Factory.instance;
}
interface MyCallback {
void onSuccess(HttpResultJuHe result);
void onFailture(String error);
void onSuccess(HttpResult result);
}
/**
* 添加参数方式
*/
public void postClickAppInfoParameter(final MyCallback mCallback) {
FactoryInters.PostClickAppInfoServerParameter server = retrofit.create(FactoryInters.PostClickAppInfoServerParameter.class);
final Call<HttpResultJuHe> call = server.getJuheResult("13429667914", "safly");
call.enqueue(new Callback<HttpResultJuHe>() {
@Override
public void onResponse(final Call<HttpResultJuHe> call, final Response<HttpResultJuHe> response) {
Log.i(TAG, "response------------>" + response.body().toString());
retroHttpHandler.post(new Runnable() {
@Override
public void run() {
if (mCallback != null) {
mCallback.onSuccess(response.body());
if (call != null)
call.cancel();
}
}
});
}
@Override
public void onFailure(Call<HttpResultJuHe> call, Throwable t) {
String message = t.getMessage();
if (mCallback != null) {
mCallback.onFailture(message);
}
}
});
}
/**
* map方式
*/
public void postClickAppInfoParameterMap(final MyCallback mCallback) {
FactoryInters.PostClickAppInfoServerMap server = retrofit.create(FactoryInters.PostClickAppInfoServerMap.class);
Map<String, String> options = new HashMap<>();
options.put("phone", "13429667914");
options.put("key", "safly");
final Call<HttpResultJuHe> call = server.getJuheResult(options);
call.enqueue(new Callback<HttpResultJuHe>() {
@Override
public void onResponse(final Call<HttpResultJuHe> call, final Response<HttpResultJuHe> response) {
Log.i(TAG, "response------------>" + response.body().toString());
retroHttpHandler.post(new Runnable() {
@Override
public void run() {
if (mCallback != null) {
mCallback.onSuccess(response.body());
if (call != null)
call.cancel();
}
}
});
}
@Override
public void onFailure(Call<HttpResultJuHe> call, Throwable t) {
String message = t.getMessage();
if (mCallback != null) {
mCallback.onFailture(message);
}
}
});
}
/**构建请求体方式
* {"phone_num": "18612185929", "imei": "123456789012345", "godin_id": "4c59396301ab6274bd7892f0b31df36e", "contact_ids": ["1475920950100"]}
*/
public void postClickAppInfoParameterJsonBody(final MyCallback mCallback) {
FactoryInters.PostClickAppInfoParameterJsonBody server = retrofit.create(FactoryInters.PostClickAppInfoParameterJsonBody.class);
ArrayList<String> contact_ids = new ArrayList<>();
contact_ids.add("1475920950100");
HttpRequest httpRequest = new HttpRequest();
httpRequest.setPhone_num("18612185929");
httpRequest.setImei("123456789012345");
httpRequest.setGodin_id("4c59396301ab6274bd7892f0b31df36e");
httpRequest.setContact_ids(contact_ids);
final Call<HttpResult> call = server.getJuheResult(httpRequest);
call.enqueue(new Callback<HttpResult>() {
@Override
public void onResponse(final Call<HttpResult> call, final Response<HttpResult> response) {
Log.i(TAG, "response------------>" + response.body().toString());
retroHttpHandler.post(new Runnable() {
@Override
public void run() {
if (mCallback != null) {
mCallback.onSuccess(response.body());
if (call != null)
call.cancel();
}
}
});
}
@Override
public void onFailure(Call<HttpResult> call, Throwable t) {
String message = t.getMessage();
if (mCallback != null) {
mCallback.onFailture(message);
}
}
});
}
}
接口文件FactoryInters
package com.godinsec.db;
import java.util.Map;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
import rx.Observable;
/**
* Created by Safly on 2016/11/2.
* {"resultcode":"101","reason":"错误的请求KEY!","result":null,"error_code":10001}
*
* http://apis.juhe.cn/mobile/get?phone=13429667914&key=safly
*
*/
public interface FactoryInters {
interface PostClickAppInfoServerParameter {
@GET("mobile/get")
Call<HttpResultJuHe> getJuheResult(@Query("phone") String phone,
@Query("key") String key);
}
interface PostClickAppInfoServerMap {
@GET("mobile/get")
Call<HttpResultJuHe> getJuheResult(@QueryMap Map<String, String> options);
}
///api/v1.0/DeletePrivateContact
interface PostClickAppInfoParameterJsonBody{
@Headers({"Content-Type: application/json","Accept: application/json"})
@POST("DeletePrivateContact")
Call<HttpResult> getJuheResult(@Body HttpRequest request);
}
}
让我们来看下测试请求http://apis.juhe.cn/mobile/get?phone=13429667914&key=safly的返回结果把:
HttpResultJuHe{resultcode='101', reason='错误的请求KEY!', result='null', error_code='10001'}
对应的HttpResultJuHe
package com.godinsec.db;
/**
* {"resultcode":"101","reason":"错误的请求KEY!","result":null,"error_code":10001}
*/
public final class HttpResultJuHe {
private String resultcode;
private String reason;
private String result;
private String error_code;
public HttpResultJuHe(String resultcode, String reason, String result, String error_code) {
this.resultcode = resultcode;
this.reason = reason;
this.result = result;
this.error_code = error_code;
}
public HttpResultJuHe() {
}
public String getResultcode() {
return resultcode;
}
public void setResultcode(String resultcode) {
this.resultcode = resultcode;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public String getError_code() {
return error_code;
}
public void setError_code(String error_code) {
this.error_code = error_code;
}
@Override
public String toString() {
return "HttpResultJuHe{" +
"resultcode='" + resultcode + '\'' +
", reason='" + reason + '\'' +
", result='" + result + '\'' +
", error_code='" + error_code + '\'' +
'}';
}
}
封装请求体
http://x-phone.cn/api/v1.0/DeletePrivateContact
HttpResult{head=Head{statuscode='000009', statusmsg='device and user not match'}}
对应的HttpRequest
package com.godinsec.db;
import java.util.ArrayList;
/**
* 删除联系人封装的请求体
* {"phone_num": "18612185929", "imei": "123456789012345", "godin_id": "4c59396301ab6274bd7892f0b31df36e", "contact_ids": ["1475920950100"]}
*/
public class HttpRequest {
private String phone_num;
private String imei;
private String godin_id;
private ArrayList<String> contact_ids;
public ArrayList<String> getContact_ids() {
return contact_ids;
}
public void setContact_ids(ArrayList<String> contact_ids) {
this.contact_ids = contact_ids;
}
public String getPhone_num() {
return phone_num;
}
public void setPhone_num(String phone_num) {
this.phone_num = phone_num;
}
public String getImei() {
return imei;
}
public void setImei(String imei) {
this.imei = imei;
}
public String getGodin_id() {
return godin_id;
}
public void setGodin_id(String godin_id) {
this.godin_id = godin_id;
}
@Override
public String toString() {
return "HttpRequest{" +
"phone_num='" + phone_num + '\'' +
", imei='" + imei + '\'' +
", godin_id='" + godin_id + '\'' +
", contact_ids=" + contact_ids +
'}';
}
}
对应的封装请求参数HttpRequest
package com.godinsec.db;
import java.util.ArrayList;
/**
* 删除联系人封装的请求体
* {"phone_num": "18612185929", "imei": "123456789012345", "godin_id": "4c59396301ab6274bd7892f0b31df36e", "contact_ids": ["1475920950100"]}
*/
public class HttpRequest {
private String phone_num;
private String imei;
private String godin_id;
private ArrayList<String> contact_ids;
public ArrayList<String> getContact_ids() {
return contact_ids;
}
public void setContact_ids(ArrayList<String> contact_ids) {
this.contact_ids = contact_ids;
}
public String getPhone_num() {
return phone_num;
}
public void setPhone_num(String phone_num) {
this.phone_num = phone_num;
}
public String getImei() {
return imei;
}
public void setImei(String imei) {
this.imei = imei;
}
public String getGodin_id() {
return godin_id;
}
public void setGodin_id(String godin_id) {
this.godin_id = godin_id;
}
@Override
public String toString() {
return "HttpRequest{" +
"phone_num='" + phone_num + '\'' +
", imei='" + imei + '\'' +
", godin_id='" + godin_id + '\'' +
", contact_ids=" + contact_ids +
'}';
}
}
最后看主界面MainActivity
package com.godinsec.db;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import java.util.ArrayList;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RetrofitManger.getInstance().postClickAppInfoParameter(new RetrofitManger.MyCallback() {
@Override
public void onSuccess(HttpResultJuHe result) {
Log.i("MainActivity", "response------------>" + result.toString());
}
@Override
public void onFailture(String error) {
}
@Override
public void onSuccess(HttpResult result) {
}
});
RetrofitManger.getInstance().postClickAppInfoParameterMap(new RetrofitManger.MyCallback() {
@Override
public void onSuccess(HttpResultJuHe result) {
Log.i("MainActivity", "response------------>" + result.toString());
}
@Override
public void onFailture(String error) {
}
@Override
public void onSuccess(HttpResult result) {
}
});
RetrofitManger.getInstance().postClickAppInfoParameterJsonBody(new RetrofitManger.MyCallback() {
@Override
public void onSuccess(HttpResultJuHe result) {
}
@Override
public void onFailture(String error) {
}
@Override
public void onSuccess(HttpResult result) {
Log.i("MainActivity", "response------------>" + result.toString());
}
});
}
}