├── .gitignore ├── .idea ├── caches │ └── build_file_checksums.ser ├── codeStyles │ └── Project.xml ├── compiler.xml ├── dbnavigator.xml ├── gradle.xml ├── jarRepositories.xml ├── misc.xml ├── modules.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── assets │ └── test.txt │ ├── java │ └── com │ │ └── ansen │ │ └── okhttp │ │ └── test │ │ ├── activity │ │ └── MainActivity.java │ │ ├── app │ │ └── MyApplication.java │ │ └── entity │ │ ├── BaseProtocol.java │ │ └── User.java │ └── res │ ├── layout │ └── activity_main.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── mipmap-xxxhdpi │ └── ic_launcher.png │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── okhttpencapsulation ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── ansen │ │ └── http │ │ ├── entity │ │ └── HttpConfig.java │ │ ├── net │ │ ├── HTTPCaller.java │ │ ├── Header.java │ │ ├── HttpResponseHandler.java │ │ ├── NameValuePair.java │ │ └── RequestDataCallback.java │ │ └── util │ │ └── Util.java │ └── res │ └── values │ └── strings.xml └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | -------------------------------------------------------------------------------- /.idea/caches/build_file_checksums.ser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansen666/OkHttpEncapsulation/d475510220f89419aa25e055d920625413a61193/.idea/caches/build_file_checksums.ser -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 11 | 12 | 13 | 14 | 15 | 21 | 22 | 26 | 27 | 28 | 29 | 31 | 32 | 33 |
34 | 35 | 36 | 37 | xmlns:android 38 | 39 | ^$ 40 | 41 | 42 | 43 |
44 |
45 | 46 | 47 | 48 | xmlns:.* 49 | 50 | ^$ 51 | 52 | 53 | BY_NAME 54 | 55 |
56 |
57 | 58 | 59 | 60 | .*:id 61 | 62 | http://schemas.android.com/apk/res/android 63 | 64 | 65 | 66 |
67 |
68 | 69 | 70 | 71 | .*:name 72 | 73 | http://schemas.android.com/apk/res/android 74 | 75 | 76 | 77 |
78 |
79 | 80 | 81 | 82 | name 83 | 84 | ^$ 85 | 86 | 87 | 88 |
89 |
90 | 91 | 92 | 93 | style 94 | 95 | ^$ 96 | 97 | 98 | 99 |
100 |
101 | 102 | 103 | 104 | .* 105 | 106 | ^$ 107 | 108 | 109 | BY_NAME 110 | 111 |
112 |
113 | 114 | 115 | 116 | .* 117 | 118 | http://schemas.android.com/apk/res/android 119 | 120 | 121 | ANDROID_ATTRIBUTE_ORDER 122 | 123 |
124 |
125 | 126 | 127 | 128 | .* 129 | 130 | .* 131 | 132 | 133 | BY_NAME 134 | 135 |
136 |
137 |
138 |
139 |
140 |
-------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/dbnavigator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | 29 | 30 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 1.8 14 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### 前言 2 | http请求基本上每一个app都会使用,进行好的封装提供Activity调用是非常有必要的,并且当我们切换http请求库的时候也只会修改封装的地方,而不需要修改Activity代码。最近比较火的http请求库就属[OkHttp](https://github.com/square/okhttp)了,这里我们对[OkHttp](https://github.com/square/okhttp)的get请求、post请求、上传文件进行了封装。 3 | 4 | ### 封装的目的 5 | - 封装基本的公共方法给外部调用。get请求,Post请求- ,PostFile,downloadFile。简化代码。 6 | - 官方建议OkHttpClient实例只new一次。 7 | - 如果同一时间访问同一个api多次,那我们默认情况只会保留最后一个请求。这个调用的可以也可以通过参数控制。 8 | - 如果用户连接Http代理了,就不让访问,防止用户通过抓包工具看我们的接口数据。这个也可以在初始化的时候通过改变HttpConfig的agent属性控制。 9 | - 每个接口都要带上的参数应该封装起来,例如app版本号,设备号,登录之后的用户token,这些参数可能每次请求都要带上。当然我们需要的时候也可以对公共参数进行修改。 10 | - 把返回的json字符串转成对象再回调回来。当然你想要byte数组也可以。只需要重写RequestDataCallback接口的不同方法。 11 | - 我们访问服务器用的是异步请求,不可能每个调用的地方拿到数据还要通过handler来刷新ui,底层直接封装了一个handler统一处理。 12 | - 上传文件跟下载文件支持进度回调。 13 | 14 | ### 使用 15 | #### 1.依赖 16 | 如果是android studio开发支持在线依赖: 17 | ``` 18 | compile 'com.ansen.http:okhttpencapsulation:1.0.5' 19 | ``` 20 | 21 | 如果是eclipse那你先把ide切换到android studio吧。。。不闲麻烦的话也可以把源码module的源码copy出来,反正也就几个类。 22 | 23 | #### 2.初始化HTTPCaller类 24 | 初始化的工作可以放Application,新建MyApplication类继承Application。初始化的时候通过HttpConfig设置一些参数,也可以添加公共参数。 25 | ``` 26 | public class MyApplication extends Application{ 27 | @Override 28 | public void onCreate() { 29 | super.onCreate(); 30 | 31 | HttpConfig httpConfig=new HttpConfig(); 32 | httpConfig.setAgent(true);//有代理的情况能不能访问 33 | httpConfig.setDebug(true);//是否debug模式 如果是debug模式打印log 34 | httpConfig.setTagName("ansen");//打印log的tagname 35 | 36 | //可以添加一些公共字段 每个接口都会带上 37 | httpConfig.addCommonField("pf","android"); 38 | httpConfig.addCommonField("version_code","1"); 39 | 40 | //初始化HTTPCaller类 41 | HTTPCaller.getInstance().setHttpConfig(httpConfig); 42 | } 43 | } 44 | ``` 45 | 46 | 因为自定义Application,需要给AndroidManifest.xml文件application标签中的android:name属性赋值,指定自己重写的MyApplication。 47 | 48 | #### 发送get请求 49 | 发送get请求就一行代码。 50 | ``` 51 | HTTPCaller.getInstance().get(User.class, "http://139.196.35.30:8080/OkHttpTest/getUserInfo.do?per=123", null, requestDataCallback); 52 | ``` 53 | 54 | #### 请求回调 55 | http请求回调接口,无论成功或者失败都会回调。因为是测试所以都用在这个接口来回调,在真实的企业开发中,不同的请求用不同的回调。 56 | ``` 57 | private RequestDataCallback requestDataCallback = new RequestDataCallback() { 58 | @Override 59 | public void dataCallback(User user) { 60 | if(user==null){ 61 | Log.i("ansen", "请求失败"); 62 | }else{ 63 | Log.i("ansen", "获取用户信息:" + user.toString()); 64 | } 65 | 66 | } 67 | }; 68 | ``` 69 | 70 | #### 发送post请求 71 | post请求参数不是跟在url后面的,所以需要把请求参数放到集合里面。因为登录接口也是返回的用户信息,所以可以跟get请求用同一回调。 72 | ``` 73 | List postParam = new ArrayList<>(); 74 | postParam.add(new NameValuePair("username","ansen")); 75 | postParam.add(new NameValuePair("password","123")); 76 | HTTPCaller.getInstance().post(User.class, "http://139.196.35.30:8080/OkHttpTest/login.do", null, postParam, requestDataCallback); 77 | ``` 78 | 79 | #### 上传文件 80 | ##### 1.上传文件不带回调进度 81 | ``` 82 | updaloadFile(null); 83 | ``` 84 | 85 | ##### 2.上传文件回调上传进度 86 | ``` 87 | updaloadFile(new ProgressUIListener(){ 88 | @Override 89 | public void onUIProgressChanged(long numBytes, long totalBytes, float percent, float speed) { 90 | Log.i("ansen","numBytes:"+numBytes+" totalBytes:"+totalBytes+" percent:"+percent+" speed:"+speed); 91 | } 92 | }); 93 | ``` 94 | 95 | 上传文件跟其他表单参数不一样的地方就是new NameValuePair对象的时候需要传入三个参数,最后一个参数需要设置成true。 96 | ``` 97 | private void updaloadFile(ProgressUIListener progressUIListener){ 98 | List postParam = new ArrayList<>(); 99 | postParam.add(new NameValuePair("username", "ansen")); 100 | postParam.add(new NameValuePair("password", "123")); 101 | String filePath=copyFile();//复制一份文件到sdcard上,并且获取文件路径 102 | postParam.add(new NameValuePair("upload_file",filePath,true)); 103 | if(progressUIListener==null){//上传文件没有回调进度条 104 | HTTPCaller.getInstance().postFile(User.class, "http://139.196.35.30:8080/OkHttpTest/uploadFile.do", null, postParam, requestDataCallback); 105 | }else{//上传文件并且回调上传进度 106 | HTTPCaller.getInstance().postFile(User.class, "http://139.196.35.30:8080/OkHttpTest/uploadFile.do", null, postParam, requestDataCallback,progressUIListener); 107 | } 108 | } 109 | ``` 110 | 111 | #### 上传文件(传入byte数组) 112 | ``` 113 | byte[] bytes=getUploadFileBytes();//获取文件内容存入byte数组 114 | HTTPCaller.getInstance().postFile(User.class, "http://139.196.35.30:8080/OkHttpTest/uploadFile.do", null, "upload_file","test.txt",bytes,requestDataCallback); 115 | ``` 116 | 117 | #### 上传文件(传入byte数组)&&回调上传进度 118 | ``` 119 | byte[] bytes=getUploadFileBytes();//获取文件内容存入byte数组 120 | HTTPCaller.getInstance().postFile(User.class, "http://139.196.35.30:8080/OkHttpTest/uploadFile.do", null, "upload_file", "test.txt", bytes, requestDataCallback, new ProgressUIListener() { 121 | @Override 122 | public void onUIProgressChanged(long numBytes, long totalBytes, float percent, float speed) { 123 | Log.i("ansen","upload file content numBytes:"+numBytes+" totalBytes:"+totalBytes+" percent:"+percent+" speed:"+speed); 124 | } 125 | }); 126 | ``` 127 | 128 | #### 下载文件&&回调下载进度 129 | ``` 130 | String saveFilePath=Environment.getExternalStorageDirectory() + "/test/test222.txt"; 131 | HTTPCaller.getInstance().downloadFile("http://139.196.35.30:8080/OkHttpTest/upload/test.txt",saveFilePath,null,new ProgressUIListener(){ 132 | @Override 133 | public void onUIProgressChanged(long numBytes, long totalBytes, float percent, float speed) { 134 | Log.i("ansen","dowload file content numBytes:"+numBytes+" totalBytes:"+totalBytes+" percent:"+percent+" speed:"+speed); 135 | } 136 | }); 137 | ``` 138 | 139 | #### 修改公共参数 140 | ``` 141 | HTTPCaller.getInstance().updateCommonField("version_code","2");//更新公共字段版本号的值 142 | ``` 143 | 144 | ### 关于这几个测试接口的服务器 145 | [想看服务器源码点这里](https://github.com/ansen666/OkHttpTest) 146 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 29 5 | buildToolsVersion "29.0.3" 6 | 7 | defaultConfig { 8 | applicationId "com.ansen.okhttp.test" 9 | minSdkVersion 19 10 | targetSdkVersion 29 11 | versionCode 1 12 | versionName "1.0" 13 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 14 | } 15 | 16 | buildTypes { 17 | release { 18 | minifyEnabled false 19 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 20 | } 21 | } 22 | } 23 | 24 | dependencies { 25 | implementation fileTree(dir: 'libs', include: ['*.jar']) 26 | 27 | implementation 'androidx.appcompat:appcompat:1.1.0' 28 | testImplementation 'junit:junit:4.12' 29 | androidTestImplementation 'androidx.test:runner:1.2.0' 30 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' 31 | implementation project(':okhttpencapsulation') 32 | // implementation 'com.ansen.http:okhttpencapsulation:1.0.5' 33 | } 34 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/ansen/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/ansen/okhttp/test/activity/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.ansen.okhttp.test.activity; 2 | 3 | import android.Manifest; 4 | import android.content.pm.PackageManager; 5 | import android.content.res.AssetManager; 6 | import android.os.Build; 7 | import android.os.Environment; 8 | import android.os.Bundle; 9 | import android.util.Log; 10 | import android.view.View; 11 | 12 | import androidx.appcompat.app.AppCompatActivity; 13 | 14 | import com.ansen.http.net.NameValuePair; 15 | import com.ansen.okhttp.test.R; 16 | import com.ansen.okhttp.test.entity.User; 17 | import com.ansen.http.net.HTTPCaller; 18 | import com.ansen.http.net.RequestDataCallback; 19 | 20 | import java.io.File; 21 | import java.io.FileOutputStream; 22 | import java.io.IOException; 23 | import java.io.InputStream; 24 | import java.io.OutputStream; 25 | import java.util.ArrayList; 26 | import java.util.List; 27 | 28 | import io.github.lizhangqu.coreprogress.ProgressUIListener; 29 | 30 | public class MainActivity extends AppCompatActivity implements View.OnClickListener { 31 | private String[] perms = {Manifest.permission.WRITE_EXTERNAL_STORAGE}; 32 | private final int PERMS_REQUEST_CODE = 200; 33 | 34 | @Override 35 | protected void onCreate(Bundle savedInstanceState) { 36 | super.onCreate(savedInstanceState); 37 | setContentView(R.layout.activity_main); 38 | 39 | findViewById(R.id.tv_get).setOnClickListener(this); 40 | findViewById(R.id.tv_get_sync).setOnClickListener(this); 41 | findViewById(R.id.tv_post).setOnClickListener(this); 42 | findViewById(R.id.tv_post_sync).setOnClickListener(this); 43 | findViewById(R.id.tv_upload_file).setOnClickListener(this); 44 | findViewById(R.id.tv_upload_file_progress).setOnClickListener(this); 45 | findViewById(R.id.tv_upload_file_content).setOnClickListener(this); 46 | findViewById(R.id.tv_upload_file_content_progress).setOnClickListener(this); 47 | findViewById(R.id.tv_download_file).setOnClickListener(this); 48 | findViewById(R.id.tv_modify_version).setOnClickListener(this); 49 | 50 | if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {//Android 6.0以上版本需要获取权限 51 | requestPermissions(perms,PERMS_REQUEST_CODE);//请求权限 52 | } 53 | } 54 | 55 | @Override 56 | public void onClick(View v) { 57 | if (v.getId() == R.id.tv_get) { 58 | HTTPCaller.getInstance().get(User.class, "http://139.196.35.30:8080/OkHttpTest/getUserInfo.do?per=123", requestDataCallback); 59 | } else if(v.getId()==R.id.tv_get_sync){ 60 | getSync(); 61 | }else if (v.getId() == R.id.tv_post) { 62 | List postParam = new ArrayList<>(); 63 | postParam.add(new NameValuePair("username","ansen")); 64 | postParam.add(new NameValuePair("password","123")); 65 | HTTPCaller.getInstance().post(User.class, "http://139.196.35.30:8080/OkHttpTest/login.do", postParam, requestDataCallback); 66 | } else if(v.getId()==R.id.tv_post_sync){ 67 | postSync(); 68 | }else if (v.getId() == R.id.tv_upload_file) { 69 | updaloadFile(null); 70 | }else if (v.getId() == R.id.tv_upload_file_progress) { 71 | updaloadFile(new ProgressUIListener(){ 72 | @Override 73 | public void onUIProgressChanged(long numBytes, long totalBytes, float percent, float speed) { 74 | Log.i("ansen","numBytes:"+numBytes+" totalBytes:"+totalBytes+" percent:"+percent+" speed:"+speed); 75 | } 76 | }); 77 | }else if(v.getId()==R.id.tv_upload_file_content){ 78 | byte[] bytes=getUploadFileBytes();//获取文件内容存入byte数组 79 | HTTPCaller.getInstance().postFile(User.class, "http://139.196.35.30:8080/OkHttpTest/uploadFile.do", null, "upload_file","test.txt",bytes,requestDataCallback); 80 | }else if(v.getId()==R.id.tv_upload_file_content_progress){ 81 | byte[] bytes=getUploadFileBytes();//获取文件内容存入byte数组 82 | HTTPCaller.getInstance().postFile(User.class, "http://139.196.35.30:8080/OkHttpTest/uploadFile.do", null, "upload_file", "test.txt", bytes, requestDataCallback, new ProgressUIListener() { 83 | @Override 84 | public void onUIProgressChanged(long numBytes, long totalBytes, float percent, float speed) { 85 | Log.i("ansen","upload file content numBytes:"+numBytes+" totalBytes:"+totalBytes+" percent:"+percent+" speed:"+speed); 86 | } 87 | }); 88 | }else if(v.getId()==R.id.tv_download_file){//下载文件 89 | String saveFilePath=Environment.getExternalStorageDirectory() + "/test/test222.txt"; 90 | HTTPCaller.getInstance().downloadFile("http://139.196.35.30:8080/OkHttpTest/upload/test.txt",saveFilePath,null,new ProgressUIListener(){ 91 | @Override 92 | public void onUIProgressChanged(long numBytes, long totalBytes, float percent, float speed) { 93 | Log.i("ansen","dowload file content numBytes:"+numBytes+" totalBytes:"+totalBytes+" percent:"+percent+" speed:"+speed); 94 | } 95 | }); 96 | }else if(v.getId()==R.id.tv_modify_version){ 97 | HTTPCaller.getInstance().updateCommonField("version_code","2");//更新公共字段版本号的值 98 | } 99 | } 100 | 101 | private void updaloadFile(ProgressUIListener progressUIListener){ 102 | List postParam = new ArrayList<>(); 103 | postParam.add(new NameValuePair("username", "ansen")); 104 | postParam.add(new NameValuePair("password", "123")); 105 | String filePath=copyFile();//复制一份文件到sdcard上,并且获取文件路径 106 | postParam.add(new NameValuePair("upload_file",filePath,true)); 107 | if(progressUIListener==null){//上传文件没有回调进度条 108 | HTTPCaller.getInstance().postFile(User.class, "http://139.196.35.30:8080/OkHttpTest/uploadFile.do", null, postParam, requestDataCallback); 109 | }else{//上传文件并且回调上传进度 110 | HTTPCaller.getInstance().postFile(User.class, "http://139.196.35.30:8080/OkHttpTest/uploadFile.do", null, postParam, requestDataCallback,progressUIListener); 111 | } 112 | } 113 | 114 | @Override 115 | public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults) { 116 | switch (permsRequestCode) { 117 | case PERMS_REQUEST_CODE: 118 | boolean storageAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED; 119 | if (storageAccepted) { 120 | 121 | } else { 122 | Log.i("MainActivity", "没有写磁盘的判断退出APP"); 123 | finish(); 124 | } 125 | break; 126 | 127 | } 128 | } 129 | 130 | private RequestDataCallback requestDataCallback = new RequestDataCallback() { 131 | @Override 132 | public void dataCallback(User user) { 133 | if(user==null){ 134 | Log.i("ansen", "请求失败"); 135 | }else{ 136 | Log.i("ansen", "获取用户信息:" + user.toString()); 137 | } 138 | } 139 | }; 140 | 141 | private byte[] getUploadFileBytes(){ 142 | byte[] bytes=null; 143 | try { 144 | InputStream inputStream = getAssets().open("test.txt"); 145 | Log.i("ansen","文件长度:"+inputStream.available()); 146 | bytes = new byte[inputStream.available()]; 147 | inputStream.read(bytes); 148 | inputStream.close(); 149 | } catch (IOException e) { 150 | e.printStackTrace(); 151 | } 152 | return bytes; 153 | } 154 | 155 | /** 156 | * 如果sd卡存在这个文件就先删除 157 | * 然后再从assets下把test.txt复制到sd卡上 158 | * @return 159 | */ 160 | private String copyFile() { 161 | AssetManager assetManager = this.getAssets(); 162 | String newFilePath=Environment.getExternalStorageDirectory() + "/test/test.txt"; 163 | 164 | File file=new File(newFilePath); 165 | if(file.exists()){ 166 | file.delete(); 167 | } 168 | 169 | try { 170 | InputStream in = assetManager.open("test.txt"); 171 | OutputStream out = new FileOutputStream(newFilePath); 172 | byte[] buffer = new byte[1024]; 173 | int read; 174 | while ((read = in.read(buffer)) != -1) { 175 | out.write(buffer, 0, read); 176 | } 177 | in.close(); 178 | out.flush(); 179 | out.close(); 180 | } catch (Exception e) { 181 | Log.e("tag", e.getMessage()); 182 | } 183 | return newFilePath; 184 | } 185 | 186 | 187 | //在Android中UI线程是不能访问网络的,如果是同步请求网络,需要放在子线程中 188 | private void getSync(){ 189 | new Thread(){ 190 | @Override 191 | public void run() { 192 | User user=HTTPCaller.getInstance().getSync(User.class,"http://139.196.35.30:8080/OkHttpTest/getUserInfo.do?per=123"); 193 | Log.i("ansen","get sync 用户name:"+user.getUsername()); 194 | } 195 | }.start(); 196 | } 197 | 198 | private void postSync(){ 199 | new Thread(){ 200 | @Override 201 | public void run() { 202 | List postParam = new ArrayList<>(); 203 | postParam.add(new NameValuePair("username","ansen")); 204 | postParam.add(new NameValuePair("password","123")); 205 | User user=HTTPCaller.getInstance().postSync(User.class,"http://139.196.35.30:8080/OkHttpTest/login.do",postParam); 206 | Log.i("ansen","post sync 用户name:"+user.getUsername()); 207 | } 208 | }.start(); 209 | } 210 | } 211 | -------------------------------------------------------------------------------- /app/src/main/java/com/ansen/okhttp/test/app/MyApplication.java: -------------------------------------------------------------------------------- 1 | package com.ansen.okhttp.test.app; 2 | 3 | import android.app.Application; 4 | 5 | import com.ansen.http.entity.HttpConfig; 6 | import com.ansen.http.net.HTTPCaller; 7 | 8 | /** 9 | * Created by ansen 10 | * Create Time 2017-06-10 11 | */ 12 | public class MyApplication extends Application{ 13 | @Override 14 | public void onCreate() { 15 | super.onCreate(); 16 | 17 | HttpConfig httpConfig=new HttpConfig(); 18 | httpConfig.setAgent(true);//有代理的情况能不能访问 19 | httpConfig.setDebug(true);//是否debug模式 如果是debug模式打印log 20 | httpConfig.setTagName("ansen");//打印log的tagname 21 | 22 | //可以添加一些公共字段 每个接口都会带上 23 | httpConfig.addCommonField("pf","android"); 24 | httpConfig.addCommonField("version_code","1"); 25 | 26 | //初始化HTTPCaller类 27 | HTTPCaller.getInstance().setHttpConfig(httpConfig); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/ansen/okhttp/test/entity/BaseProtocol.java: -------------------------------------------------------------------------------- 1 | package com.ansen.okhttp.test.entity; 2 | 3 | /** 4 | * Created by ansen 5 | * Create Time 2017-06-10 6 | */ 7 | public class BaseProtocol { 8 | private String errorReason; 9 | 10 | public String getErrorReason() { 11 | return errorReason; 12 | } 13 | 14 | public void setErrorReason(String errorReason) { 15 | this.errorReason = errorReason; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/ansen/okhttp/test/entity/User.java: -------------------------------------------------------------------------------- 1 | package com.ansen.okhttp.test.entity; 2 | 3 | /** 4 | * Created by ansen 5 | * Create Time 2017-06-10 6 | */ 7 | public class User extends BaseProtocol{ 8 | private String password; 9 | private String username; 10 | 11 | public String getPassword() { 12 | return password; 13 | } 14 | 15 | public void setPassword(String password) { 16 | this.password = password; 17 | } 18 | 19 | public String getUsername() { 20 | return username; 21 | } 22 | 23 | public void setUsername(String username) { 24 | this.username = username; 25 | } 26 | 27 | @Override 28 | public String toString() { 29 | return "User{" + 30 | "password='" + password + '\'' + 31 | ", username='" + username + '\'' + 32 | '}'; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 |