OkHttp3的简单封装

  1. public class OkHttpUtil {
  2. public static final String TAG="OkHttpUtil";
  3. private static OkHttpClient client;
  4. private static OkHttpUtil httpUtil;
  5.  
  6. private OkHttpUtil(){
  7. client=new OkHttpClient.Builder()
  8. .connectTimeout(10, TimeUnit.SECONDS)
  9. .readTimeout(10,TimeUnit.SECONDS)
  10. .build();
  11. }
  12.  
  13. // 使用单例模式,保证只有一个OkHttpUtil和OkHttpClient 的实例。
  14. public static OkHttpUtil getInstance(){
  15. synchronized (OkHttpUtil.class){
  16. if(httpUtil==null){
  17. httpUtil= new OkHttpUtil();
  18. return httpUtil;
  19. }
  20. }
  21. return httpUtil;
  22. }
  23.  
  24. /**
  25. * get异步请求
  26. * @param url
  27. */
  28. public static void getData(String url){
  29. Request request=new Request.Builder().url(url)
  30. .build();
  31. client.newCall(request).enqueue(new Callback() {
  32. @Override
  33. public void onFailure(Call call, IOException e) {
  34.  
  35. }
  36.  
  37. @Override
  38. public void onResponse(Call call, Response response) throws IOException {
  39. //字符串类型
  40. Log.i(TAG, "getData: " + response.body().string());
  41. //字节数组类型
  42. Log.i(TAG, "getData: " + response.body().bytes());
  43. //字节流类型
  44. Log.i(TAG, "getData: " + response.body().byteStream());
  45. //字符流类型
  46. Log.i(TAG, "getData: " + response.body().charStream());
  47. }
  48. });
  49. }
  50.  
  51. /**
  52. * 带有多个参数的get请求
  53. * @param url
  54. * @param map
  55. */
  56. public void getParams(String url,Map<String,String> map){
  57. String url1=url;
  58.  
  59. if(map!=null&&map.size()>0){
  60. for(String key:map.keySet()){
  61. url1+="&"+key+"="+map.get(key);
  62. }
  63. }
  64. getData(url1);
  65. }
  66.  
  67. /**
  68. * 提交单个键值对
  69. * @param url
  70. * @param key
  71. * @param value
  72. */
  73. public void postKeyValuePaire(String url,String key,String value){
  74. FormBody formBody=new FormBody.Builder()
  75. .add(key,value)
  76. .build();
  77. Request request=new Request.Builder()
  78. .url(url)
  79. .post(formBody)
  80. .build();
  81. client.newCall(request).enqueue(new Callback() {
  82. @Override
  83. public void onFailure(Call call, IOException e) {
  84.  
  85. }
  86.  
  87. @Override
  88. public void onResponse(Call call, Response response) throws IOException {
  89.  
  90. }
  91. });
  92. }
  93.  
  94. /**
  95. * 提交多个键值对
  96. *
  97. * @param url 提交的路径
  98. * @param map 用来放置键值对,map的key对应键,value对应值
  99. */
  100.  
  101. public void postMap(String url,Map<String ,String> map){
  102. FormBody.Builder formBody=new FormBody.Builder();
  103. if(map!=null){
  104. for(String key:map.keySet()){
  105. formBody.add(key,map.get(key));
  106. }
  107. }
  108. Request request=new Request.Builder().url(url)
  109. .post(formBody.build())
  110. .build();
  111. client.newCall(request).enqueue(new Callback() {
  112. @Override
  113. public void onFailure(Call call, IOException e) {
  114.  
  115. }
  116.  
  117. @Override
  118. public void onResponse(Call call, Response response) throws IOException {
  119.  
  120. }
  121. });
  122. }
  123.  
  124. /**
  125. * post提交Json数据
  126. * @param url
  127. * @param content
  128. */
  129. public void postString(String url,String content){
  130.  
  131. MediaType mediaType=MediaType.parse("application/json; charset=utf-8");
  132. RequestBody requestBody=RequestBody.create(mediaType,content);
  133. Request request=new Request.Builder()
  134. .url(url)
  135. .post(requestBody)
  136. .build();
  137. client.newCall(request)
  138. .enqueue(new Callback() {
  139. @Override
  140. public void onFailure(Call call, IOException e) {
  141.  
  142. }
  143.  
  144. @Override
  145. public void onResponse(Call call, Response response) throws IOException {
  146.  
  147. }
  148. });
  149. }
  150.  
  151. /**
  152. * 上传单一文件
  153. */
  154. public void uploadFile(String url, File file, Callback callback){
  155. MediaType type=MediaType.parse(getMediaType(file.getName()));//设置上传文件的类型
  156. MultipartBody.Builder builder = new MultipartBody.Builder()
  157. .setType(MultipartBody.FORM)
  158. .addFormDataPart("file", file.getName(),
  159. RequestBody.create(type, file));
  160.  
  161. RequestBody requestBody = builder.build();
  162.  
  163. Request request = new Request.Builder()
  164. .url(url)
  165. .post(requestBody)
  166. .build();
  167.  
  168. client.newCall(request).enqueue(callback);
  169. }
  170.  
  171. /**
  172. * 上传多个文件
  173. * @param url
  174. * @param files
  175. */
  176. public void uploadFiles(String url,File[] files){
  177. MultipartBody.Builder builder=new MultipartBody
  178. .Builder()
  179. .setType(MultipartBody.FORM);
  180. for(int i = 0; i<files.length; i++){
  181. RequestBody fileBody=RequestBody.create(MediaType.parse(getMediaType(files[i].getName())),files[i]);
  182. builder.addFormDataPart("file",files[i].getName(),fileBody);
  183. }
  184. Request request=new Request.Builder()
  185. .url(url)
  186. .post(builder.build())
  187. .build();
  188. client.newCall(request)
  189. .enqueue(new Callback() {
  190. @Override
  191. public void onFailure(Call call, IOException e) {
  192.  
  193. }
  194. @Override
  195. public void onResponse(Call call, Response response) throws IOException {
  196.  
  197. }
  198. });
  199. }
  200.  
  201. /**
  202. * 上传多个文件和参数
  203. * @param url url地址
  204. * @param files 文件
  205. * @param map 参数
  206. */
  207. public void uplaodMultiFiles(String url, File[] files, Map<String ,String> map){
  208. MultipartBody.Builder builder=new MultipartBody.Builder().setType(MultipartBody.FORM);
  209. //添加文件
  210. if(files!=null&&files.length>0){
  211. for(int i=0;i<files.length;i++){
  212. builder.addFormDataPart("uploadfile",files[i].getName(),RequestBody.create(MediaType.parse(files[i].getName()),files[i]));
  213. }
  214. }
  215.  
  216. //添加参数
  217. if(map!=null&&map.size()>0){
  218. for(String key:map.keySet()){
  219. builder.addFormDataPart(key,map.get(key));
  220. }
  221. }
  222. Request request=new Request.Builder().url(url)
  223. .post(builder.build())
  224. .build();
  225. client.newCall(request).enqueue(new Callback() {
  226. @Override
  227. public void onFailure(Call call, IOException e) {
  228.  
  229. }
  230. @Override public void onResponse(Call call, Response response) throws IOException {
  231.  
  232. }
  233. });
  234. }
  235.  
  236. /**
  237. * 根据文件的名称判断文件的MediaType
  238. * @param fileName 文件名
  239. * @return 文件的MediaType
  240. */
  241. private String getMediaType(String fileName){
  242. FileNameMap map= URLConnection.getFileNameMap();
  243. String contentTypeFor=map.getContentTypeFor(fileName);
  244. if(contentTypeFor==null){
  245. contentTypeFor="applicationn/octet-stream";
  246. }
  247. return contentTypeFor;
  248. }
  249.  
  250. /**
  251. * 设置请求头
  252. * @param headersParams 请求头参数
  253. * @return headers
  254. */
  255. private Headers SetHeaders(Map<String, String> headersParams){
  256. Headers headers=null;
  257. okhttp3.Headers.Builder headersbuilder=new okhttp3.Headers.Builder();
  258. if(headersParams != null) {
  259. Iterator<String> iterator = headersParams.keySet().iterator(); String key = "";
  260. while (iterator.hasNext()) { key = iterator.next().toString();
  261. headersbuilder.add(key, headersParams.get(key));
  262. Log.d("get http", "get_headers==="+key+"===="+headersParams.get(key));
  263. }
  264. }
  265. headers=headersbuilder.build(); return headers;
  266. }
  267.  
  268. /**
  269. * get方法连接拼加参数
  270. * @param mapParams 参数
  271. * @return 拼接后的url
  272. */
  273. private String setUrlParams(Map<String, String> mapParams){
  274. String strParams = "";
  275. if(mapParams != null){
  276. Iterator<String> iterator = mapParams.keySet().iterator();
  277. String key = "";
  278. while (iterator.hasNext()) {
  279. key = iterator.next().toString();
  280. strParams += "&"+ key + "=" + mapParams.get(key);
  281. }
  282. }
  283. return strParams;
  284. }
  285.  
  286. }

  

OkHttp3的简单使用(二)的更多相关文章

  1. iOS开发UI篇—Quartz2D简单使用(二)

    iOS开发UI篇—Quartz2D简单使用(二) 一.画文字 代码: // // YYtextview.m // 04-写文字 // // Created by 孔医己 on 14-6-10. // ...

  2. 使用C语言实现二维,三维绘图算法(3)-简单的二维分形

    使用C语言实现二维,三维绘图算法(3)-简单的二维分形 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其 ...

  3. 【sql注入】简单实现二次注入

    [sql注入]简单实现二次注入 本文转自:i春秋社区 测试代码1:内容详情页面 [PHP] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 1 ...

  4. VC6下OpenGL 开发环境的构建外加一个简单的二维网络棋盘绘制示例

    一.安装GLUT 工具包 GLUT 不是OpenGL 所必须的,但它会给我们的学习带来一定的方便,推荐安装. Windows 环境下的GLUT 本地下载地址:glut-install.zip(大小约为 ...

  5. Java秒杀简单设计二:数据库表和Dao层设计

    Java秒杀简单设计二:数据库表Dao层设计 上一篇中搭建springboot项目环境和设计数据库表  https://www.cnblogs.com/taiguyiba/p/9791431.html ...

  6. 爬虫简单之二---使用进程爬取起点中文网的六万多也页小说的名字,作者,等一些基本信息,并存入csv中

    爬虫简单之二---使用进程爬取起点中文网的六万多也页小说的名字,作者,等一些基本信息,并存入csv中 准备使用的环境和库Python3.6 + requests + bs4 + csv + multi ...

  7. SignalR的简单使用(二)

    原文:SignalR的简单使用(二) 之前提到SignalR代理在网页,通过生成的Js来完成相关的功能.但我不禁想一个问题, 难到SignalR的服务端就能寄存在web端吗,通过访问网页能方式才能启动 ...

  8. Redis入门很简单之二【常见操作命令】

    Redis入门很简单之二[常见操作命令] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存  Redis提供了丰富的命令,允许我们连接客户端对其进行直接操作.这里简单介绍一 ...

  9. 猫狗大战("简单的二维背包")

    题面:https://www.luogu.com.cn/problem/P1489 看上去是一道简单的二维费用背包,但是要特别小心循环顺序. Ⅰ先循环物品,再循环限制条件. Ⅱ每一个限制条件都必须从后 ...

随机推荐

  1. 搭建Dynamic Web Project(动态web项目)的springmvc工程1

    本文转载自:http://blog.csdn.net/typa01_kk/article/details/45902955 此篇创建Dynamic Web Projec工程(动态web项目),下一篇, ...

  2. Oracle存储过程使用总结

    1.使用Oracle存储过程查询结果集: 网上写的都是他妈的扯淡!其实一句话就行了,你只要返回一个游标就OK了.具体代码如下: CREATE OR REPLACE PROCEDURE PR_ORDER ...

  3. Linux Restricted Shell Bypass

    Author: @n4ckhcker & @h4d3sw0rm Introduction Hello, so first of all let’s explain what is a rest ...

  4. EasyUI应用总结

    1 <%@ page language="java" contentType="text/html; charset=utf-8" 2 pageEncod ...

  5. Win7 IE11 F2无法切换版本

    Win7 IE11 F2无法切换版本 http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=45154 选择操作系统对应的版本 ht ...

  6. C++深度解析教程学习笔记(5)面向对象

    1. 面向对象基本概念 (1)面向对象的意义在于 ①将日常生活中习惯的思维方式引入程序设计中 ②将需求中的概念直观的映射到解决方案中 ③以模块为中心构建可复用的软件系统 ④提高软件产品的可维护性和可扩 ...

  7. android 除法运算保留小数点

    java保留两位小数问题: 方式一: 四舍五入 double f = 111231.5585; BigDecimal b = new BigDecimal(f); double f1 = b.setS ...

  8. Java字节码

    Java字节码 javap -c 反编译.class文件可得字节码 知乎讨论https://www.zhihu.com/question/27831730 栈和局部变量操作 将常量压入栈的指令 aco ...

  9. mysql中的自定义函数

    创建不带参数的自定义函数: 使用: 创建带参数的自定义函数: 使用: 创建具有复合结构的函数体的自定义函数:

  10. python闭包和装饰器的理解

    闭包: 两个函数的嵌套,外部函数返回内部函数的引⽤,外部函数⼀定有参数 def 外部函数(参数): def 内部函数(): pass return 内部函数 他跟函数之间的区别: 1.格式两个函数嵌套 ...