OKhttp在Androlua中的应用探索
 OKhttp在Androlua中的应用
HTTP是现代应用程序常用的数据交换网络协议。高效使用HTTP可以加快资源加载速度,节省带宽。
OkHttp是一个高效的HTTP客户端,具有以下特点:
- 支持HTTP/2,允许同一主机的所有请求共享一个socket连接
- 使用连接池减少请求延迟
- 透明GZIP压缩减小响应数据大小
- 响应缓存避免重复请求
OkHttp在网络问题时仍能保持稳定。它会自动恢复常见的连接问题,并在第一个IP失败时尝试备用IP。OkHttp使用最新的TLS技术(SNI, ALPN)建立新连接,握手失败时会回退到TLS 1.0。
OkHttp支持Android 2.3及以上版本,Java要求JDK 1.7+。
官方仓库:
https://github.com/square/okhttp
 使用示例
 异步GET请求
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 
 | require "import"import "android.app.*"
 import "android.os.*"
 import "android.widget.*"
 import "android.view.*"
 import "okhttp3.*"
 
 
 request = Request.Builder()
 .url("http://www.baidu.com/")
 .build()
 
 
 client = OkHttpClient()
 call = client.newCall(request)
 call.enqueue(Callback{
 onFailure = function(call, e)
 print("请求失败")
 end,
 
 onResponse = function(call, response)
 print(response.body().string())
 end
 })
 
 | 
异步请求会被加入到Dispatcher的runningAsyncCalls队列。请求是否立即发起受maxRequests和maxRequestsPerHost限制。符合条件时,会从readyAsyncCalls移到runningAsyncCalls,然后由OkHttp内部线程池执行。
 同步GET请求
| 12
 3
 4
 5
 
 | 
 
 response = call.execute()
 print(response.body().string())
 
 | 
同步请求会阻塞调用线程,应在子线程中执行。Android 3.0+不允许主线程网络访问。
 POST提交String
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | import "okhttp3.*"
 mediaType = MediaType.parse("text/plain; charset=utf-8")
 
 requestBody = RequestBody.create(mediaType, "Hello World")
 request = Request.Builder()
 .url("https://api.example.com/post")
 .post(requestBody)
 .build()
 
 
 
 | 
 POST提交文件
| 12
 3
 4
 5
 6
 
 | file = File("/path/to/file")requestBody = RequestBody.create(MediaType.parse("application/octet-stream"), file)
 request = Request.Builder()
 .url("https://api.example.com/upload")
 .post(requestBody)
 .build()
 
 | 
 POST提交表单
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | requestBody = FormBody.Builder().add("username", "test")
 .add("password", "123456")
 .build()
 
 request = Request.Builder()
 .url("https://api.example.com/login")
 .post(requestBody)
 .build()
 
 | 
 图片上传实例
| 12
 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
 
 | intent = Intent(Intent.ACTION_PICK)
 intent.setType("image/*")
 this.startActivityForResult(intent, 1)
 
 function onActivityResult(requestCode, resultCode, data)
 if data then
 
 cursor = this.getContentResolver().query(data.getData(), null, null, null, null)
 cursor.moveToFirst()
 filePath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA))
 
 
 requestBody = MultipartBody.Builder()
 .setType(MultipartBody.FORM)
 .addFormDataPart("file", File(filePath).getName(),
 RequestBody.create(MediaType.parse("image/*"), File(filePath)))
 .build()
 
 
 request = Request.Builder()
 .url("https://api.example.com/upload")
 .post(requestBody)
 .build()
 
 OkHttpClient().newCall(request).enqueue(Callback{
 onResponse = function(call, response)
 print(response.body().string())
 end
 })
 end
 end
 
 | 
 OkHttp优缺点
优点:
- 支持HTTP/2,可合并同主机请求
- 连接池减少延迟
- GZIP压缩
- 响应缓存
- 拦截器机制灵活
缺点:
 参考资料