11 | * Created by tianyang on 2017/9/27. 12 | */ 13 | 14 | public class App extends Application { 15 | @Override 16 | public void onCreate() { 17 | super.onCreate(); 18 | 19 | NetMgr.getInstance().registerProvider(new BaseNetProvider()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/hd123/httpframe/config/Constant.java: -------------------------------------------------------------------------------- 1 | package com.hd123.httpframe.config; 2 | 3 | /** 4 | * Created by dzq on 16/7/12. 5 | */ 6 | public class Constant { 7 | public static String accessToken = ""; 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/hd123/httpframe/net/cases/GetCitiesCase.java: -------------------------------------------------------------------------------- 1 | package com.hd123.httpframe.net.cases; 2 | 3 | import com.hd123.httpframe.net.cases.base.UseCase; 4 | import com.hd123.httpframe.net.models.City; 5 | 6 | import java.util.List; 7 | 8 | import retrofit2.http.GET; 9 | import retrofit2.http.POST; 10 | import rx.Observable; 11 | 12 | /** 13 | * 界面描述: 14 | *
15 | * Created by tianyang on 2017/9/27.
16 | */
17 |
18 | public class GetCitiesCase extends UseCase
17 | * Created by tianyang on 2017/9/27.
18 | */
19 |
20 | public abstract class UseCase
8 | * Created by tianyang on 2017/9/27.
9 | */
10 |
11 | public class ApiException extends IOException {
12 | public ApiException(String message) {
13 | super(message);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/app/src/main/java/com/hd123/httpframe/net/extension/BaseNetProvider.java:
--------------------------------------------------------------------------------
1 | package com.hd123.httpframe.net.extension;
2 |
3 |
4 | import com.hd123.httpframe.BuildConfig;
5 | import com.hd123.httpframe.config.Constant;
6 | import com.hd123.httpframe.net.exception.ApiException;
7 | import com.hd123.httpframe.net.retrofit.NetProvider;
8 | import com.hd123.httpframe.net.retrofit.RequestHandler;
9 |
10 | import java.io.IOException;
11 |
12 | import okhttp3.CookieJar;
13 | import okhttp3.Interceptor;
14 | import okhttp3.OkHttpClient;
15 | import okhttp3.Request;
16 | import okhttp3.Response;
17 |
18 | /**
19 | * 界面描述:NetProvider实现类
20 | *
21 | * Created by tianyang on 2017/9/27.
22 | */
23 |
24 | public class BaseNetProvider implements NetProvider {
25 |
26 | private static final long CONNECT_TIME_OUT = 30;
27 | private static final long READ_TIME_OUT = 180;
28 | private static final long WRITE_TIME_OUT = 30;
29 |
30 |
31 | @Override
32 | public Interceptor[] configInterceptors() {
33 | return null;
34 | }
35 |
36 | @Override
37 | public void configHttps(OkHttpClient.Builder builder) {
38 |
39 | }
40 |
41 | @Override
42 | public CookieJar configCookie() {
43 | return null;
44 | }
45 |
46 | @Override
47 | public RequestHandler configHandler() {
48 |
49 | return new HeaderHandler();
50 | }
51 |
52 | @Override
53 | public long configConnectTimeoutSecs() {
54 | return CONNECT_TIME_OUT;
55 | }
56 |
57 | @Override
58 | public long configReadTimeoutSecs() {
59 | return READ_TIME_OUT;
60 | }
61 |
62 | @Override
63 | public long configWriteTimeoutSecs() {
64 | return WRITE_TIME_OUT;
65 | }
66 |
67 | @Override
68 | public boolean configLogEnable() {
69 | return BuildConfig.DEBUG;
70 | }
71 |
72 |
73 | private class HeaderHandler implements RequestHandler {
74 |
75 | @Override
76 | public Request onBeforeRequest(Request request, Interceptor.Chain chain) {
77 | return chain.request().newBuilder()
78 | .addHeader("X-Auth-Token", Constant.accessToken)
79 | .addHeader("Authorization", "")
80 | .build();
81 | }
82 |
83 | @Override
84 | public Response onAfterRequest(Response response, Interceptor.Chain chain)
85 | throws IOException {
86 | ApiException e = null;
87 | if (401 == response.code()) {
88 | throw new ApiException("登录已过期,请重新登录!");
89 | } else if (403 == response.code()) {
90 | throw new ApiException("禁止访问!");
91 | } else if (404 == response.code()) {
92 | throw new ApiException("链接错误");
93 | } else if (503 == response.code()) {
94 | throw new ApiException("服务器升级中!");
95 | } else if (500 == response.code()) {
96 | throw new ApiException("服务器内部错误!");
97 | }
98 | return response;
99 | }
100 | }
101 |
102 | }
103 |
--------------------------------------------------------------------------------
/app/src/main/java/com/hd123/httpframe/net/extension/BaseSubscriber.java:
--------------------------------------------------------------------------------
1 | package com.hd123.httpframe.net.extension;
2 |
3 | import rx.Subscriber;
4 |
5 | /**
6 | * 界面描述: BaseSubscriber基类,处理返回数据
7 | *
8 | * Created by tianyang on 2017/9/27.
9 | */
10 |
11 | public abstract class BaseSubscriber
9 | * Created by tianyang on 2017/9/27.
10 | */
11 |
12 | public interface IPaging
8 | * Created by tianyang on 2017/9/27.
9 | */
10 |
11 | public class City {
12 | public BigDecimal id;
13 | public String name;
14 | }
15 |
--------------------------------------------------------------------------------
/app/src/main/java/com/hd123/httpframe/net/models/PagingReq.java:
--------------------------------------------------------------------------------
1 | package com.hd123.httpframe.net.models;
2 |
3 | import android.text.TextUtils;
4 |
5 | import java.util.HashMap;
6 | import java.util.Map;
7 |
8 | /**
9 | * 界面描述:
10 | *
11 | * Created by tianyang on 2017/9/28.
12 | */
13 |
14 | public class PagingReq {
15 | public int page = 0;
16 | public int pageSize = 15;
17 | public boolean desc = true;
18 | public String sort_key;
19 |
20 |
21 | //组合参数
22 | public Map
15 | * Created by tianyang on 2017/9/27.
16 | */
17 |
18 | public class NetInterceptor implements Interceptor {
19 | private RequestHandler handler;
20 |
21 | public NetInterceptor(RequestHandler handler) {
22 | this.handler = handler;
23 | }
24 |
25 | @Override
26 | public Response intercept(@NonNull Chain chain) throws IOException {
27 | Request request = chain.request();
28 | if (handler != null) {
29 | request = handler.onBeforeRequest(request, chain);
30 | }
31 | Response response = chain.proceed(request);
32 | if (handler != null) {
33 | Response tmp = handler.onAfterRequest(response, chain);
34 | if (tmp != null) {
35 | return tmp;
36 | }
37 | }
38 | return response;
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/app/src/main/java/com/hd123/httpframe/net/retrofit/NetMgr.java:
--------------------------------------------------------------------------------
1 | package com.hd123.httpframe.net.retrofit;
2 |
3 |
4 | import com.google.gson.Gson;
5 | import com.google.gson.GsonBuilder;
6 |
7 | import java.util.HashMap;
8 | import java.util.Map;
9 | import java.util.concurrent.TimeUnit;
10 |
11 | import okhttp3.CookieJar;
12 | import okhttp3.Interceptor;
13 | import okhttp3.OkHttpClient;
14 | import okhttp3.logging.HttpLoggingInterceptor;
15 | import retrofit2.Retrofit;
16 | import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
17 | import retrofit2.converter.gson.GsonConverterFactory;
18 |
19 | /**
20 | * 界面描述:Retrofit实现类
21 | *
22 | * Created by tianyang on 2017/9/27.
23 | */
24 |
25 | public class NetMgr {
26 | private final long connectTimeoutMills = 10 * 1000L;
27 | private final long readTimeoutMills = 10 * 1000L;
28 | private NetProvider sProvider = null;
29 | private static NetMgr instance;
30 | private Map
10 | * Created by tianyang on 2017/9/27.
11 | */
12 |
13 | public interface NetProvider {
14 |
15 | Interceptor[] configInterceptors();
16 |
17 | void configHttps(OkHttpClient.Builder builder);
18 |
19 | CookieJar configCookie();
20 |
21 | RequestHandler configHandler();
22 |
23 | long configConnectTimeoutSecs();
24 |
25 | long configReadTimeoutSecs();
26 |
27 | long configWriteTimeoutSecs();
28 |
29 | boolean configLogEnable();
30 |
31 | }
32 |
--------------------------------------------------------------------------------
/app/src/main/java/com/hd123/httpframe/net/retrofit/RequestHandler.java:
--------------------------------------------------------------------------------
1 | package com.hd123.httpframe.net.retrofit;
2 |
3 | import java.io.IOException;
4 |
5 | import okhttp3.Interceptor;
6 | import okhttp3.Request;
7 | import okhttp3.Response;
8 |
9 |
10 | /**
11 | * 界面描述:
12 | *
13 | * Created by tianyang on 2017/9/27.
14 | */
15 |
16 | public interface RequestHandler {
17 |
18 | Request onBeforeRequest(Request request, Interceptor.Chain chain);
19 |
20 | Response onAfterRequest(Response response, Interceptor.Chain chain) throws IOException;
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/app/src/main/java/com/hd123/httpframe/views/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.hd123.httpframe.views;
2 |
3 | import android.os.Bundle;
4 | import android.view.View;
5 | import android.widget.TextView;
6 | import android.widget.Toast;
7 |
8 | import com.hd123.httpframe.R;
9 | import com.hd123.httpframe.net.cases.GetCitiesCase;
10 | import com.hd123.httpframe.net.extension.BaseSubscriber;
11 | import com.hd123.httpframe.net.models.City;
12 | import com.trello.rxlifecycle.components.support.RxAppCompatActivity;
13 |
14 | import java.util.List;
15 |
16 | public class MainActivity extends RxAppCompatActivity {
17 | private TextView getCitiesTv;
18 |
19 | @Override
20 | protected void onCreate(Bundle savedInstanceState) {
21 | super.onCreate(savedInstanceState);
22 | setContentView(R.layout.activity_main);
23 | getCitiesTv = (TextView) findViewById(R.id.cities_tv);
24 | }
25 |
26 | public void getCities(View view) {
27 | new GetCitiesCase().getCities()
28 | .compose(this.> getCitiesCase();
22 | }
23 |
24 |
25 | public Observable
> getCities() {
26 | return ApiClient().getCitiesCase()
27 | .compose(this.
>normalSchedulers());
28 | }
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/app/src/main/java/com/hd123/httpframe/net/cases/base/UseCase.java:
--------------------------------------------------------------------------------
1 | package com.hd123.httpframe.net.cases.base;
2 |
3 | import com.hd123.httpframe.BuildConfig;
4 | import com.hd123.httpframe.net.models.PagingReq;
5 | import com.hd123.httpframe.net.retrofit.NetMgr;
6 |
7 | import java.lang.reflect.ParameterizedType;
8 | import java.lang.reflect.Type;
9 |
10 | import rx.Observable;
11 | import rx.android.schedulers.AndroidSchedulers;
12 | import rx.schedulers.Schedulers;
13 |
14 | /**
15 | * 界面描述:
16 | *
S get(String baseUrl, Class service) {
48 | return getInstance().getRetrofit(baseUrl).create(service);
49 | }
50 |
51 | public void registerProvider(NetProvider provider) {
52 | this.sProvider = provider;
53 | }
54 |
55 | public void registerProvider(String baseUrl, NetProvider provider) {
56 | getInstance().providerMap.put(baseUrl, provider);
57 | }
58 |
59 | public NetProvider getCommonProvider() {
60 | return sProvider;
61 | }
62 |
63 | public void clearCache() {
64 | getInstance().retrofitMap.clear();
65 | getInstance().clientMap.clear();
66 | }
67 |
68 | public Retrofit getRetrofit(String baseUrl) {
69 | return getRetrofit(baseUrl, null);
70 | }
71 |
72 | public Retrofit getRetrofit(String baseUrl, NetProvider provider) {
73 | if (empty(baseUrl)) {
74 | throw new IllegalStateException("baseUrl can not be null");
75 | }
76 | if (retrofitMap.get(baseUrl) != null) {
77 | return retrofitMap.get(baseUrl);
78 | }
79 |
80 | if (provider == null) {
81 | provider = providerMap.get(baseUrl);
82 | if (provider == null) {
83 | provider = sProvider;
84 | }
85 | }
86 | checkProvider(provider);
87 |
88 | Gson gson = new GsonBuilder()
89 | .setDateFormat("yyyy-MM-dd HH:mm:ss")
90 | .create();
91 |
92 | Retrofit.Builder builder = new Retrofit.Builder()
93 | .baseUrl(baseUrl)
94 | .client(getClient(baseUrl, provider))
95 | .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
96 | .addConverterFactory(GsonConverterFactory.create(gson));
97 |
98 | Retrofit retrofit = builder.build();
99 | retrofitMap.put(baseUrl, retrofit);
100 | providerMap.put(baseUrl, provider);
101 |
102 | return retrofit;
103 | }
104 |
105 | private boolean empty(String baseUrl) {
106 | return baseUrl == null || baseUrl.isEmpty();
107 | }
108 |
109 | private OkHttpClient getClient(String baseUrl, NetProvider provider) {
110 | if (empty(baseUrl)) {
111 | throw new IllegalStateException("baseUrl can not be null");
112 | }
113 | if (clientMap.get(baseUrl) != null) {
114 | return clientMap.get(baseUrl);
115 | }
116 |
117 | checkProvider(provider);
118 |
119 | OkHttpClient.Builder builder = new OkHttpClient.Builder();
120 |
121 | builder.connectTimeout(provider.configConnectTimeoutSecs() != 0
122 | ? provider.configConnectTimeoutSecs()
123 | : connectTimeoutMills, TimeUnit.SECONDS);
124 | builder.readTimeout(provider.configReadTimeoutSecs() != 0
125 | ? provider.configReadTimeoutSecs() : readTimeoutMills, TimeUnit.SECONDS);
126 |
127 | builder.writeTimeout(provider.configWriteTimeoutSecs() != 0
128 | ? provider.configReadTimeoutSecs() : readTimeoutMills, TimeUnit.SECONDS);
129 | CookieJar cookieJar = provider.configCookie();
130 | if (cookieJar != null) {
131 | builder.cookieJar(cookieJar);
132 | }
133 | provider.configHttps(builder);
134 |
135 | RequestHandler handler = provider.configHandler();
136 | if (handler != null) {
137 | builder.addInterceptor(new NetInterceptor(handler));
138 | }
139 |
140 | Interceptor[] interceptors = provider.configInterceptors();
141 | if (!empty(interceptors)) {
142 | for (Interceptor interceptor : interceptors) {
143 | builder.addInterceptor(interceptor);
144 | }
145 | }
146 |
147 | if (provider.configLogEnable()) {
148 | HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
149 | loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
150 | builder.addInterceptor(loggingInterceptor);
151 | }
152 |
153 | OkHttpClient client = builder.build();
154 | clientMap.put(baseUrl, client);
155 | providerMap.put(baseUrl, provider);
156 |
157 | return client;
158 | }
159 |
160 | private boolean empty(Interceptor[] interceptors) {
161 | return interceptors == null || interceptors.length == 0;
162 | }
163 |
164 | private void checkProvider(NetProvider provider) {
165 | if (provider == null) {
166 | throw new IllegalStateException("must register provider first");
167 | }
168 | }
169 |
170 | public Map>bindToLifecycle())
29 | .subscribe(new BaseSubscriber
>() {
30 | @Override
31 | public void onError(Throwable e) {
32 | Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
33 | }
34 |
35 | @Override
36 | public void onNext(List