介绍
HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽,OkHttp是一个高效且十分火热的HTTP客户端。
简单使用
在postman里测试好请求后,直接可以选择复制,新版的postman语法就是okhttp3(老版的是okhttp2)
功能
OkHttpClient类: OkHttp客户端类,用来构建请求发起类Call,设置超时,设置缓存,设置拦截器等
OkHttpClient,是OkHttp的客户端类,该类使用的是构建者模式,所以通常情况下,我们使用new OkHttpClient.Builder()…build()方式来创建OkHttpClient的实例,OkHttpClient的属性以及相关方法,大部分体现在OkHttpClient.Builde中,所以我们学习OkHttpClient,就先学习OkHttpClient.Builder构建者,为了方便文章阅读,我们只挑选重点需要关注的代码进行分析。
//跳过HTTPS验证
OkHttpClient.Builder OBuilder = new OkHttpClient().newBuilder()
.connectTimeout(10000L, TimeUnit.SECONDS) // 最大连接时间
.readTimeout(10000L, TimeUnit.SECONDS) // 最大读取时间
.writeTimeout(10000L, TimeUnit.SECONDS); // 最大写入时间
if (targetUrl.startsWith("https")) {
// 添加SSL证书信任 【SSLSocketClient】
builder = builder.sslSocketFactory(SSLSocketClient.getSSLSocketFactory(), SSLSocketClient.getX509TrustManager());
}
OkHttpClient client = builder.build();
Request类: OkHttp请求包装类,用来封装网络请求信息及请求体。
比如请求方式(GET、POST、DELETE、PUT等),url,headers,请求参数等,服务器端最终接受并解析的请求消息,就是由该类提供。OkHttpClient获取Call对象时,需要传入Request作为参数;
RequestBody Request中,当请求需要传入请求体,比如向服务器端发送表单,发送json数据,上传图片,提交数据流等,就需要用到RequestBody(请求体)了
Headers 作为Http请求最重要的两个部分。Headers使用的也是构建者模式,所以Headers是完全可以通过Headers.Builder来创建,添加请求头部信息的。既然他叫做Headers,那他应该有一个专门存储头部信息的容器,用来存储我们常见的诸如:Content-Type、Cookie、Accept等键值对
targetUrl = "https://XXX" + uri;
// POST
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, data);
Request.Builder rBudlder= new Request.Builder().url(targetUrl).post(body);
// GET
String urlParameter = request.getQueryString();
Request.Builder rBudlder= new Request.Builder().url(targetUrl + "?" + urlParameter).method("GET", null);
// 其他
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, data);
Request.Builder rBudlder= new Request.Builder().url(targetUrl).method(request.getMethod(), body);
//Header
Map<String, String> headers = new HashMap<String, String>();
Enumeration headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String key = (String) headerNames.nextElement();
String value = request.getHeader(key);
headers.put(key, value);
rBudlder = method.addHeader(key, value);
}
// 设置来源
rBudlder.addHeader("Origin", "https://XXX");
rBudlder.addHeader("Referer", "https://XXX/XX");
Request req = rBudlder.build();
Call
每次发起请求的时候,都是通过Call对象调用他的同步请求execute()方法或者异步请求enqueue()方法,发起了请求。我们可以把Call当成OkHttp提供给我们的一个面对开发者的网络请求发起者,通过OkHttpClient对象和Request对象,创建了Call,然后由Call对象发出同步或者异步请求
Response Response与Request的结构非常相似,也使用了构建者模式,拿到请求结果,意味着任务完成。
// 代码衔接上面
Response resp = client.newCall(req).execute();
String res = resp.body().string();
System.out.println("返回数据:" + res);
参考: OkHttp3.0(二)