一个最简单的OkHttpClient
一个复杂点的OkHttpClient配置
具体可配置参数见OkHttpClient.Builder类,几点注意事项:
两种拦截器的区别
官方提供的Logging Interceptor
地址: https://github.com/victorfan336/okhttp-logging-interceptor
gradle.build中添加依赖:
compile 'com.squareup.okhttp3:logging-interceptor:3.1.2'
通过Request.Builder创建请求,默认是Get请求
主要是构建RequestBody,并设置Content-Type消息头。
1.普通Post请求
比如json请求
2. 使用FormBody传递键值对参数
Content-Type: application/x-www-form-urlencoded
比如:
3. 使用RequestBody传递Json或File对象
4. 使用MultipartBody同时传递键值对参数和File对象
5. 使用MultipartBody提交分块请求
6. 自定义RequestBody实现流的上传
1、同步执行
由于android强制要求网络请求在线程中执行,所以无法使用execute
2、异步执行
1. 设置请求头
2. 设置超时
3. 设置缓存
1、对于Get请求,如果请求参数较多,自己拼接Url较为麻烦
比如
拼接结果: http://www.baidu.com/user/login/username=zhangsan&password=123456
如果能做一些封装,直接addParam(key,value)的形式则会简单很多。
2、Callback在子线程中回调,大部分时候,我们都是需要更新UI的,还需自己post到主线程中处理。
3、构建请求步骤比较多
因此,Square提供了针对OkHttp的封装库Retrofit,另外Github上也有很多第三方的封装库,比如OkGo。
首先需要在url中加特殊标记/协议, 如在onWebViewResource方法中拦截对应的请求,然后将要添加的请求头,以get形式拼接到url末尾。拦截器没搞懂就先搞这个法子暂时先写到请求里面,不然api接口啥都用不了,其实也并不是特别麻烦,后续要改,不考虑使用拦截器的话,可能要使用到sqlite数据库,emmmm,想想还是别这么干。
1,post + header
public void postTest(){
OkHttpClient client = new OkHttpClient()
//post请求
FormBody formBody = new FormBody.Builder()
.add("event_id","33")
.build()
Request request = new Request.Builder().url(DecryptionAddress+"app/event/accept").
addHeader("Token","服务器获取的token").post(formBody).build()
client.newCall(request).enqueue(new Callback() {
public void onFailure(Call call, IOException e) {
System.out.println(e.getMessage())
} public void onResponse(Call call, Response response) throws IOException {
if(response.code() >= 200 &&response.code() <300) {
String result = response.body().string()
System.out.println(result)
}
}
})
}
登录后复制
2,get + header
123456789101112131415161718192021222324final Request.Builder builder = new Request.Builder().url(url)builder.addHeader(key,value) //将请求头以键值对形式添加,可添加多个请求头:
final Request request = builder.build()final OkHttpClient client = new OkHttpClient.Builder() .readTimeout(30, TimeUnit.SECONDS) .connectTimeout(10, TimeUnit.SECONDS) .writeTimeout(60, TimeUnit.SECONDS) .build() //设置各种超时时间final Call call = client.newCall(request)new Thread(new Runnable() { @Override public void run() { try { Response response = call.execute() if (response != null) { } else { } } catch (IOException e) { e.printStackTrace() } }}).start()
HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。握手过程的简单描述如下:
浏览器将自己支持的一套加密算法、HASH算法发送给网站。
1.网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
2.浏览器获得网站证书之后,开始验证证书的合法性,如果证书信任,则生成一串随机数字作为通讯过程中对称加密的秘钥。然后取出证书中的公钥,将这串数字以及HASH的结果进行加密,然后发给网站。
3.网站接收浏览器发来的数据之后,通过私钥进行解密,然后HASH校验,如果一致,则使用浏览器发来的数字串使加密一段握手消息发给浏览器。
4.浏览器解密,并HASH校验,没有问题,则握手结束。接下来的传输过程将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)