ok的网址(okHttp使用及优缺点)

上传日期:2023-04-25 浏览次数:

前言

今天在这里要讲的是一个网络库,okHttp相对于其它网络库有很多不同,使用、效率、拦截器都有很多不同,当然也有坏处,比如callback回来

是在线程里面, 不能刷新UI,访问请求跟apache有很多不同,这点注意,还有访问请求的时候,Get和Post有不同就是看一个地方,如果是用其它

网络库,一定会迷惑到底那个才是GetPOST,文章中会细细解答,本文会以介绍、使用、优缺点来三大块阐述。

一、介绍

OKHttp是一款高效的HTTP客户端,支持连接同一地址的链接共享同一个socket,通过连接池来减小响应延迟,

还有透明的GZIP压缩,请求缓存等优势,其核心主要有路由、连接协议、拦截器、代理、安全性认证、连接池以

及网络适配,拦截器主要是指添加,移除或者转换请求或者回应的头部信息,总流程图如下:

当然要详细了解核心解刨内核东西网址如:

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0326/2643.html等。

二、使用

1.okhttp初始化

Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {

@Override public Response intercept(Chain chain) throws IOException {

Response originalResponse = chain.proceed(chain.request());

return originalResponse.newBuilder()

.removeHeader("Pragma")

.header("Cache-Control", String.format("max-age=%d", 60))

.build();

}

};

mOkHttpClient.setConnectTimeout(15000, TimeUnit.SECONDS);

mOkHttpClient.setReadTimeout(15000, TimeUnit.SECONDS);

mOkHttpClient.setWriteTimeout(15000, TimeUnit.SECONDS);

mOkHttpClient.setRetryOnConnectionFailure(true);

//-------------------------------设置http缓存,提升用户体验-----------------------------------

Cache cache;

File httpCacheDirectory = StorageUtils.getOwnCacheDirectory(context,HTTP_CACHE_FILENAME);

cache = new Cache(httpCacheDirectory, 10 * 1024);

mOkHttpClient.setCache(cache);

mOkHttpClient.networkInterceptors().add(REWRITE_CACHE_CONTROL_INTERCEPTOR);

//-------------------------------设置http缓存,提升用户体验-----------------------------------

// Handler mDelivery = new Handler(Looper.getMainLooper());

if (false) {

mOkHttpClient.setHostnameVerifier(new HostnameVerifier() {

@Override

public boolean verify(String hostname, SSLSession session) {

return true;

}

});

}

2.Get申请数据


  1. Request request = new Request.Builder()
  2. .url("网络地址这里面设置一个传参数如何办")
  3. .addHeader("Accept", "application/json; q=0.5").build();

上面代码看到url缺么有带post,这就是get,我当时看到这个半天还在想这就是Get,至少带get的字样,缺么有,这就是Get,然后这

里面涉及的一个参数如何传。会有两个问题参数如何传、如果是apache的,如何转到okhttps,后面都会在我的github会封装一个库。


  1. <span style="white-space:pre"> </span>FormEncodingBuilder body = new FormEncodingBuilder();
  2. for (ConcurrentHashMap.Entry<String, String> entry : params.urlParams.entrySet()) {
  3. body.addEncoded(entry.getKey(), entry.getValue());
  4. }
  5. Request request = new Request.Builder()
  6. .url(getUrlWithQueryString(true, params.url, params))
  7. .build();
  8. try {
  9. BaseOkHandler handler = new BaseOkHandler(callback, params);
  10. client.newCall(request).enqueue(handler);
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. }

上面看到的params就相当于apache中的RequestParams类,里面传入参数就可以,借鉴的并做修改后得到。


  1. getUrlWithQueryString(boolean shouldEncodeUrl, String url, BaseParams params) {
  2. if (url == null)
  3. return null;
  4. if (shouldEncodeUrl) {
  5. try {
  6. String decodedURL = URLDecoder.decode(url, "UTF-8");
  7. URL _url = new URL(decodedURL);
  8. URI _uri = new URI(_url.getProtocol(), _url.getUserInfo(), _url.getHost(), _url.getPort(), _url.getPath(),
  9. _url.getQuery(), _url.getRef());
  10. url = _uri.toASCIIString();
  11. } catch (Exception ex) {
  12. // Should not really happen, added just for sake of validity
  13. }
  14. }
  15. if (params != null) {
  16. // Construct the query string and trim it, in case it
  17. // includes any excessive white spaces.
  18. String paramString = params.getParamString().trim();
  19. // Only add the query string if it isn't empty and it
  20. // isn't equal to '?'.
  21. if (!paramString.equals("") && !paramString.equals("?")) {
  22. url += url.contains("?") ? "&" : "?";
  23. url += paramString;
  24. }
  25. }
  26. return url;
  27. }

而这个函数就是把所有参数格式化拼接成一个字符串。

3.Post申请数据


  1. Request request = new Request.Builder()
  2. .url(url)
  3. .post(body)//post是关键,提交表单数据、这里面有封装好多库。
  4. .build();
  5. Response response = client.newCall(request).execute();

4.Post提交文件


  1. MultipartBuilder builder = new MultipartBuilder().type(MultipartBuilder.FORM);
  2. if (params.fileParams.size() > 0) {
  3. RequestBody fileBody = null;
  4. for (ConcurrentHashMap.Entry<String, BaseParams.FileWrapper> entry1 : params.fileParams.entrySet()) {
  5. {
  6. File file = entry1.getValue().file;
  7. String fileName = file.getName();
  8. fileBody = RequestBody.create(MediaType.parse(guessMimeType(fileName)), file);
  9. //TODO 根据文件名设置contentType
  10. builder.addPart(Headers.of("Content-Disposition",
  11. "form-data; name="" + entry1.getKey() + ""; filename="" + fileName + """),
  12. fileBody);
  13. }
  14. }
  15. }
  16. Request request = new Request.Builder()
  17. .url(params.url)
  18. .post(builder.build())
  19. .build();

大家看到上传文件只要使用MultipartBuilder类表单传入就可以。

5.消息回来处理


  1. public class BaseOkHandler implements Callback {
  2. private HttpCallback callBack;
  3. BaseParams param;
  4. public BaseOkHandler(HttpCallback response, BaseParams cacheParams) {
  5. this.callBack = response;
  6. param = cacheParams;
  7. }
  8. @Override
  9. public void onFailure(Request request, IOException e) {
  10. }
  11. @Override
  12. public void onResponse(Response response) throws IOException {
  13. try {
  14. if (response.isSuccessful()) {
  15. //成功得到文本信息
  16. String content = response.body().string();
  17. //通过Handler来传给UI线程。
  18. Message msg =new Message();
  19. msg.obj = content;
  20. msg.what=0;
  21. mHandler.sendMessage(msg);
  22. }
  23. } catch (Exception e) {
  24. // TODO Auto-generated catch block
  25. e.printStackTrace();
  26. }
  27. }
  28. Handler mHandler = new Handler() {
  29. @Override
  30. public void handleMessage(Message msg) {
  31. super.handleMessage(msg);
  32. switch (msg.what) {
  33. case 0:
  34. //得到数据并去做解析类。
  35. BaseEntity entity = JsonPaserFactory.paserObj(msg.obj.toString(), param.paserType);
  36. //通知UI界面
  37. callBack.onSuccess(msg.obj.toString(), entity, param.paserType);
  38. break;
  39. default:
  40. break;
  41. }
  42. }
  43. };
  44. }

三、优缺点

1、优点

支持SPDY, 可以合并多个到同一个主机的请,使用连接池技术减少请求的延迟(如果SPDY是可用的话) ,

使用GZIP压缩减少传输的数据量,缓存响应避免重复的网络请求、拦截器等等。

2、缺点

第一缺点是消息回来需要切到主线程,主线程要自己去写,第二传入调用比较复杂。

上一篇:okb官方交易平台下载(OKEx & 火星交易大师联手送福利,跑OKB网格交易机器人领USDT、BT

下一篇:ok的官网(《空洞骑士》:如何通过离线也能玩到爽?)

免费获取您的专属营销方案

验证码