ObservableRequest.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. package com.mylove.okhttp;
  2. import android.annotation.SuppressLint;
  3. import android.content.Context;
  4. import android.support.annotation.NonNull;
  5. import com.mylove.loglib.JLog;
  6. import java.io.File;
  7. import java.io.IOException;
  8. import java.util.Map;
  9. import java.util.concurrent.TimeUnit;
  10. import okhttp3.Call;
  11. import okhttp3.Callback;
  12. import okhttp3.FormBody;
  13. import okhttp3.MediaType;
  14. import okhttp3.MultipartBody;
  15. import okhttp3.OkHttpClient;
  16. import okhttp3.Request;
  17. import okhttp3.RequestBody;
  18. import okhttp3.Response;
  19. import rx.Observable;
  20. import rx.Subscriber;
  21. import rx.android.schedulers.AndroidSchedulers;
  22. import rx.schedulers.Schedulers;
  23. /**
  24. * @author myLove
  25. * @time 2017/11/15 14:19
  26. * @e-mail mylove.520.y@gmail.com
  27. * @overview
  28. */
  29. class ObservableRequest {
  30. @SuppressLint("StaticFieldLeak")
  31. private static ObservableRequest instance;
  32. @SuppressLint("StaticFieldLeak")
  33. private static Context mContext;
  34. private static RequestType requestType;
  35. private static CallType callType;
  36. private static OkHttpClient okHttpClient;
  37. private String mCacheUrl = "";
  38. private static MediaType mediaType;
  39. private static String urlMsg;
  40. private static String label;
  41. static ObservableRequest getInstance(Context context, RequestType type1, CallType type2) {
  42. if (instance == null) {
  43. synchronized (ObservableRequest.class) {
  44. if (instance == null) {
  45. instance = new ObservableRequest();
  46. OkHttpClient httpClient = new OkHttpClient();
  47. okHttpClient = httpClient.newBuilder()
  48. .addNetworkInterceptor(new CacheInterceptor())
  49. .cache(Cache.privateCache(context))
  50. .connectTimeout(30, TimeUnit.SECONDS)
  51. .readTimeout(30, TimeUnit.SECONDS)
  52. .build();
  53. }
  54. }
  55. }
  56. mContext = context;
  57. requestType = type1;
  58. callType = type2;
  59. return instance;
  60. }
  61. static ObservableRequest getInstance(MediaType mediaType1, String msg, String labelStr, Context context, RequestType type1, CallType type2) {
  62. if (instance == null) {
  63. synchronized (ObservableRequest.class) {
  64. if (instance == null) {
  65. instance = new ObservableRequest();
  66. OkHttpClient httpClient = new OkHttpClient();
  67. okHttpClient = httpClient.newBuilder()
  68. .addNetworkInterceptor(new CacheInterceptor())
  69. .cache(Cache.privateCache(context))
  70. .connectTimeout(30, TimeUnit.SECONDS)
  71. .readTimeout(30, TimeUnit.SECONDS)
  72. .build();
  73. }
  74. }
  75. }
  76. mediaType = mediaType1;
  77. urlMsg = msg;
  78. label = labelStr;
  79. mContext = context;
  80. requestType = type1;
  81. callType = type2;
  82. return instance;
  83. }
  84. void request(String url, Map<Object, Object> oMap, final onOkHttpListener onOkHttpListener) {
  85. getObservable(url, oMap).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
  86. .subscribe(new Subscriber<ResultMsg>() {
  87. @Override
  88. public void onCompleted() {
  89. onOkHttpListener.onCompleted();
  90. }
  91. @Override
  92. public void onError(Throwable e) {
  93. onOkHttpListener.onFailure(e);
  94. }
  95. @Override
  96. public void onNext(ResultMsg s) {
  97. onOkHttpListener.onSuccess(s);
  98. }
  99. });
  100. }
  101. private Observable<ResultMsg> getObservable(final String url, final Map<Object, Object> oMap) {
  102. return Observable.unsafeCreate(new Observable.OnSubscribe<ResultMsg>() {
  103. @Override
  104. public void call(Subscriber<? super ResultMsg> subscriber) {
  105. send(url, oMap, subscriber);
  106. }
  107. });
  108. }
  109. private void send(String url, Map<Object, Object> map, Subscriber<? super ResultMsg> subscriber) {
  110. if (FormatUtil.isMapNotEmpty(map)) {
  111. mCacheUrl = url + map.toString();
  112. } else {
  113. mCacheUrl = url;
  114. }
  115. InternetBean bean = Internet.ifInternet(mContext);
  116. if (bean.getStatus()) {
  117. Call call = okHttpClient.newCall(getRequest(url, map));
  118. sendCall(call, subscriber);
  119. } else {
  120. String json = CacheUtils.getInstance(mContext).getCacheToLocalJson(mCacheUrl);
  121. if (FormatUtil.isNotEmpty(json)) {
  122. ResultMsg msg = new ResultMsg();
  123. msg.setCode("404");
  124. msg.setResult(json);
  125. subscriber.onNext(msg);
  126. } else {
  127. subscriber.onError(new Error(bean.getMsg()));
  128. }
  129. subscriber.onCompleted();
  130. }
  131. }
  132. /**
  133. * 请求
  134. */
  135. void sendCall(Call call, Subscriber<? super ResultMsg> subscriber) {
  136. if (callType == CallType.SYNC) {
  137. sync(call, subscriber);
  138. } else if (callType == CallType.ASYNC) {
  139. async(call, subscriber);
  140. }
  141. }
  142. /**
  143. * 同步请求
  144. */
  145. private void sync(Call call, Subscriber<? super ResultMsg> subscriber) {
  146. try {
  147. Response execute = call.execute();
  148. ResultMsg msg = new ResultMsg();
  149. int code = execute.code();
  150. msg.setCode(code + "");
  151. msg.setResult("");
  152. if (execute.isSuccessful()) {
  153. String str = execute.body().string();
  154. msg.setResult(str);
  155. if (!str.contains("<!DOCTYPE html>")) {
  156. if (FormatUtil.isNotEmpty(mCacheUrl)) {
  157. CacheUtils.getInstance(mContext).setCacheToLocalJson(mCacheUrl, str);
  158. }
  159. }
  160. subscriber.onNext(msg);
  161. subscriber.onCompleted();
  162. } else {
  163. String json = CacheUtils.getInstance(mContext).getCacheToLocalJson(mCacheUrl);
  164. if (FormatUtil.isNotEmpty(json)) {
  165. msg.setResult(json);
  166. subscriber.onNext(msg);
  167. } else {
  168. subscriber.onError(new Exception("请求失败"));
  169. }
  170. subscriber.onCompleted();
  171. }
  172. } catch (IOException e) {
  173. String json = CacheUtils.getInstance(mContext).getCacheToLocalJson(mCacheUrl);
  174. ResultMsg msg = new ResultMsg();
  175. msg.setCode("404");
  176. if (FormatUtil.isNotEmpty(json)) {
  177. msg.setResult(json);
  178. subscriber.onNext(msg);
  179. } else {
  180. subscriber.onError(e);
  181. }
  182. e.printStackTrace();
  183. subscriber.onCompleted();
  184. }
  185. }
  186. /**
  187. * 异步请求
  188. */
  189. private void async(Call call, final Subscriber<? super ResultMsg> subscriber) {
  190. JLog.v();
  191. call.enqueue(new Callback() {
  192. @Override
  193. public void onFailure(@NonNull Call call, @NonNull IOException e) {
  194. String json = CacheUtils.getInstance(mContext).getCacheToLocalJson(mCacheUrl);
  195. ResultMsg msg = new ResultMsg();
  196. msg.setCode("404");
  197. if (FormatUtil.isNotEmpty(json)) {
  198. msg.setResult(json);
  199. subscriber.onNext(msg);
  200. } else {
  201. subscriber.onError(e);
  202. }
  203. e.printStackTrace();
  204. subscriber.onCompleted();
  205. }
  206. @Override
  207. public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
  208. String str = response.body().string();
  209. JLog.v(str);
  210. ResultMsg msg = new ResultMsg();
  211. int code = response.code();
  212. msg.setCode(code + "");
  213. msg.setResult(str);
  214. if (!str.contains("<!DOCTYPE html>")) {
  215. if (FormatUtil.isNotEmpty(mCacheUrl)) {
  216. CacheUtils.getInstance(mContext).setCacheToLocalJson(mCacheUrl, str);
  217. }
  218. }
  219. subscriber.onNext(msg);
  220. subscriber.onCompleted();
  221. }
  222. });
  223. }
  224. private Request request(String url, Map<Object, Object> map) {
  225. FormBody.Builder builder = new FormBody.Builder();
  226. if (FormatUtil.isMapNotEmpty(map)) {
  227. for (Map.Entry<Object, Object> entry : map.entrySet()) {
  228. builder.add(entry.getKey().toString(), entry.getValue().toString());
  229. }
  230. }
  231. FormBody build = builder.build();
  232. return new Request.Builder()
  233. .url(url)
  234. .post(build)
  235. .build();
  236. }
  237. /**
  238. * 判断请求方式
  239. *
  240. * @param url 地址
  241. * @param oMap 键值
  242. * @return request
  243. */
  244. private Request getRequest(String url, Map<Object, Object> oMap) {
  245. if (requestType == null) {
  246. requestType = RequestType.POST;
  247. }
  248. switch (requestType) {
  249. case GET:
  250. return get(url, oMap);
  251. case POST_XML_SOAP:
  252. return postXMLToSoap(url, oMap);
  253. case UP_FILE:
  254. return upFile(url, oMap);
  255. case ALL:
  256. return upAll(url, oMap);
  257. case POST:
  258. default:
  259. return post(url, oMap);
  260. }
  261. }
  262. private Request postXMLToSoap(String url, Map<Object, Object> oMap) {
  263. if (!FormatUtil.isMapNotEmpty(oMap)) {
  264. throw new NullPointerException("请求的数据不能为空");
  265. }
  266. StringBuilder sb = new StringBuilder();
  267. sb.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:").append(label).append("=\"http://www.orion.com/lpz\">");
  268. sb.append("<soapenv:Header/>");
  269. sb.append("<soapenv:Body>");
  270. sb.append("<").append(label).append(":").append(urlMsg).append(">");
  271. for (Map.Entry<Object, Object> entry : oMap.entrySet()) {
  272. String key = entry.getKey().toString();
  273. String value = entry.getValue().toString();
  274. sb.append("<").append(label).append(":").append(key).append(">").append(value).append("</").append(label).append(":").append(key).append(">");
  275. }
  276. sb.append("</").append(label).append(":").append(urlMsg).append(">");
  277. sb.append("</soapenv:Body>");
  278. sb.append("</soapenv:Envelope>");
  279. return new Request.Builder()
  280. .url(url)
  281. .post(RequestBody.create(mediaType, sb.toString()))
  282. .build();
  283. }
  284. /**
  285. * 上传文件
  286. *
  287. * @param url 地址
  288. * @param oMap 键值
  289. * @return request
  290. */
  291. private Request upFile(String url, Map<Object, Object> oMap) {
  292. MultipartBody.Builder builder = new MultipartBody.Builder()
  293. .setType(MultipartBody.FORM);
  294. if (FormatUtil.isMapNotEmpty(oMap)) {
  295. for (Map.Entry<Object, Object> entry : oMap.entrySet()) {
  296. File file = new File(entry.getValue().toString());
  297. int indexOf = entry.getValue().toString().indexOf("/");
  298. RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
  299. String fileName = entry.getKey().toString().substring(indexOf + 1, entry.getKey().toString().length());
  300. builder.addFormDataPart(entry.getKey().toString(), fileName, requestBody);
  301. }
  302. }
  303. MultipartBody multipartBody = builder.build();
  304. return new Request.Builder()
  305. .url(url)
  306. .post(multipartBody)
  307. .build();
  308. }
  309. /**
  310. * 参数和文件一起上传
  311. *
  312. * @param url 地址
  313. * @param oMap 键值
  314. * @return request
  315. */
  316. private Request upAll(String url, Map<Object, Object> oMap) {
  317. MultipartBody.Builder builder = new MultipartBody.Builder()
  318. .setType(MultipartBody.ALTERNATIVE);
  319. if (FormatUtil.isMapNotEmpty(oMap)) {
  320. for (Map.Entry<Object, Object> entry : oMap.entrySet()) {
  321. File file = new File(entry.getValue().toString());
  322. int indexOf = entry.getValue().toString().lastIndexOf("/");
  323. int indexOf1 = entry.getValue().toString().lastIndexOf(".");
  324. if (indexOf > 0 && indexOf1 > 0) {
  325. RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
  326. String fileName = entry.getKey().toString().substring(indexOf + 1, entry.getKey().toString().length());
  327. builder.addFormDataPart(entry.getKey().toString(), fileName, requestBody);
  328. } else {
  329. builder.addFormDataPart(entry.getKey().toString(), entry.getValue().toString());
  330. }
  331. }
  332. }
  333. MultipartBody multipartBody = builder.build();
  334. return new Request.Builder()
  335. .url(url)
  336. .post(multipartBody)
  337. .build();
  338. }
  339. /**
  340. * get上传参数
  341. *
  342. * @param url 地址
  343. * @param oMap 键值
  344. * @return request
  345. */
  346. private Request get(String url, Map<Object, Object> oMap) {
  347. StringBuilder str = new StringBuilder(url);
  348. if (FormatUtil.isMapNotEmpty(oMap)) {
  349. str.append("?");
  350. for (Map.Entry<Object, Object> entry : oMap.entrySet()) {
  351. str.append(entry.getKey()).append("=").append(entry).append("&");
  352. }
  353. str = new StringBuilder(str.substring(0, str.length() - 1));
  354. }
  355. return new Request.Builder()
  356. .url(str.toString())
  357. .get()
  358. .build();
  359. }
  360. /**
  361. * post上传参数
  362. *
  363. * @param url 地址
  364. * @param oMap 键值
  365. * @return request
  366. */
  367. private Request post(String url, Map<Object, Object> oMap) {
  368. FormBody.Builder builder = new FormBody.Builder();
  369. if (FormatUtil.isMapNotEmpty(oMap)) {
  370. for (Map.Entry<Object, Object> entry : oMap.entrySet()) {
  371. builder.add(entry.getKey().toString(), entry.getValue().toString());
  372. }
  373. }
  374. FormBody build = builder.build();
  375. return new Request.Builder()
  376. .url(url)
  377. .post(build)
  378. .build();
  379. }
  380. }