当前位置:   article > 正文

OkHttp基础讲解_openapi okhttp

openapi okhttp

一.简介

在Android项目开发中使用HTTP协议完成与服务器通信的话,OkHttp是最常用的框架。OkHttp是一个高效的HTTP客户端,是目前Android使用最广泛的网络框架。它有几个优点。

<1> 支持Http1、Http2、Quic以及WebSocket。

<2> 连接池复用底层TCP(Socket) 减少请求延时。

<3> 无缝的支持GZIP减少数据流量。

<4> 缓存响应数据减少重复的网络请求。

<5> 请求失败自动重试主机的其他ip,自动重定向。

二.代码实现

1.Gradle依赖

implementation 'com.squareup.okhttp3:okhttp:3.9.0'

2.Get&Post请求

  1. package com.wjn.networkdemo.okhttp.only;
  2. import android.os.Bundle;
  3. import android.util.Log;
  4. import android.view.View;
  5. import android.widget.TextView;
  6. import androidx.appcompat.app.AppCompatActivity;
  7. import com.wjn.networkdemo.R;
  8. import java.io.IOException;
  9. import java.util.HashMap;
  10. import java.util.Map;
  11. import java.util.concurrent.TimeUnit;
  12. import okhttp3.Call;
  13. import okhttp3.Callback;
  14. import okhttp3.FormBody;
  15. import okhttp3.OkHttpClient;
  16. import okhttp3.Request;
  17. import okhttp3.RequestBody;
  18. import okhttp3.Response;
  19. public class OkHttpOnlyActivity extends AppCompatActivity {
  20. private TextView textView1;
  21. private TextView textView2;
  22. private String getUrl = "http://fanyi.youdao.com/openapi.do?keyfrom=imoocdict123456&key=324273592&type=data&doctype=json&version=1.1&q=blue";
  23. private String postUrl = "http://fanyi.youdao.com/openapi.do";
  24. private OkHttpClient mOkHttpClient = null;//OkHttpClient 对象
  25. @Override
  26. protected void onCreate(Bundle savedInstanceState) {
  27. super.onCreate(savedInstanceState);
  28. setContentView(R.layout.activity_okhttp_only);
  29. textView1 = findViewById(R.id.activity_okhttp_only_textview1);
  30. textView2 = findViewById(R.id.activity_okhttp_only_textview2);
  31. //创建OkHttpClient对象
  32. mOkHttpClient = new OkHttpClient.Builder()
  33. .connectTimeout(20, TimeUnit.SECONDS)//连接时间
  34. .readTimeout(20, TimeUnit.SECONDS)//读时间
  35. .writeTimeout(20, TimeUnit.SECONDS)//写时间
  36. .retryOnConnectionFailure(true)//连接失败后是否重新连接
  37. .build();
  38. textView1.setOnClickListener(new View.OnClickListener() {
  39. @Override
  40. public void onClick(View v) {
  41. getData();
  42. }
  43. });
  44. textView2.setOnClickListener(new View.OnClickListener() {
  45. @Override
  46. public void onClick(View v) {
  47. Map<String, String> params = new HashMap<>();
  48. params.put("keyfrom", "imoocdict123456");
  49. params.put("key", "324273592");
  50. params.put("type", "data");
  51. params.put("doctype", "json");
  52. params.put("version", "1.1");
  53. params.put("q", "red");
  54. postData(params);
  55. }
  56. });
  57. }
  58. /**
  59. * OkHttp Get请求
  60. */
  61. private void getData() {
  62. //1.创建Request对象 构建一个具体的网络请求对象 包括具体的请求url&请求头&请求体等等
  63. Request request = new Request.Builder().url(getUrl).get().build();
  64. //2.获取Call对象 将具体的网络请求与执行请求的实体进行绑定,形成一个具体的正式的可执行实体
  65. Call call = mOkHttpClient.newCall(request);
  66. //3.Call对象进行网络请求 enqueue异步 execute同步一般不用
  67. call.enqueue(new Callback() {
  68. @Override
  69. public void onFailure(Call call, IOException e) {
  70. Log.d("OkHttpOnlyActivity", "Get请求 onFailure方法执行 错误信息----:" + e.getMessage());
  71. }
  72. @Override
  73. public void onResponse(Call call, Response response) throws IOException {
  74. if (null != response && response.isSuccessful()) {
  75. Log.d("OkHttpOnlyActivity", "Get请求 onResponse方法执行报文----:" + response.body().string());
  76. }
  77. }
  78. });
  79. }
  80. /**
  81. * OkHttp Post请求
  82. */
  83. private void postData(final Map<String, String> params) {
  84. //1.获取FormBody.Builder对象
  85. FormBody.Builder builder = new FormBody.Builder();
  86. //2.遍历params 将其放入到FormBody.Builder 对象
  87. if (params != null && !params.isEmpty()) {
  88. for (Map.Entry<String, String> entry : params.entrySet()) {
  89. builder.add(entry.getKey(), entry.getValue());
  90. }
  91. }
  92. //3.获取RequestBody 对象
  93. RequestBody requestBody = builder.build();
  94. //4.创建Request对象 构建一个具体的网络请求对象 包括具体的请求url&请求头&请求体等等
  95. Request request = new Request.Builder().url(postUrl).post(requestBody).build();
  96. //5.获取Call对象 将具体的网络请求与执行请求的实体进行绑定,形成一个具体的正式的可执行实体
  97. Call call = mOkHttpClient.newCall(request);
  98. //6.Call对象进行网络请求 enqueue异步 execute同步一般不用
  99. call.enqueue(new Callback() {
  100. @Override
  101. public void onFailure(Call call, IOException e) {
  102. Log.d("OkHttpOnlyActivity", "Post请求 onFailure方法执行 错误信息----:" + e.getMessage());
  103. }
  104. @Override
  105. public void onResponse(Call call, Response response) throws IOException {
  106. if (null != response && response.isSuccessful()) {
  107. Log.d("OkHttpOnlyActivity", "Post请求 onResponse方法执行报文----:" + response.body().string());
  108. }
  109. }
  110. });
  111. }
  112. }

3.结果

<1> Get请求

D/OkHttpOnlyActivity: Get请求 onResponse方法执行报文----:{"translation":["蓝色的"],"basic":{"us-phonetic":"bluː","phonetic":"bluː","uk-phonetic":"bluː","explains":["adj. 蓝色的;忧郁的,悲观的;(由于冷或呼吸困难)发青的,青紫的;(电影、玩笑或故事)色情的,黄色的;(肉)未熟的;(政治上)保守的","n. 蓝色;蓝色物品;(牛津或剑桥大学的运动员)蓝色荣誉者;失误;红发人;打架","vt. (使)变成蓝色;把......染成蓝色;给\u2026\u2026上蓝色漂白剂;挥霍(钱财)","n. (Blue) (英、美、加、澳、新)布卢(人名)"]},"query":"blue","errorCode":0,"web":[{"value":["蓝色的","刀枪不入","蓝色橙味糖浆"],"key":"blue"},{"value":["蓝月","蓝月亮","千载难逢的时机"],"key":"Blue Moon"},{"value":["青尼罗省","青尼罗河","蓝色尼罗河"],"key":"Blue Nile"}]}

<2> Post请求

D/OkHttpOnlyActivity: Post请求 onResponse方法执行报文----:{"translation":["红色的"],"basic":{"us-phonetic":"red","phonetic":"red","uk-phonetic":"red","explains":["adj. 红的,红色的;(毛发)红褐色的;(脸)涨红的;(眼睛)红肿的;革命的,激进的;(人)红种的;(纸牌中)红桃的,红方块的;(葡萄酒)红的;(表示停止)红(灯),红(旗);被禁止的,危险的;(滑雪道上用红色标志指示)第二高难度的;(物理)表示夸克三种颜色之一的红色;赤色的(尤指冷战期间用于指前苏联);沾有鲜血的;(古或诗\/文)流血的;(科萨人)来自传统部落文化的","n. 红色,红颜料;红衣;红葡萄酒;红色物(或人);赤字,亏空;激进分子","n. (Red) 雷德(人名)"]},"query":"red","errorCode":0,"web":[{"value":["红","红色","赤焰战场"],"key":"RED"},{"value":["红线","台北捷运红线","红线机油"],"key":"Red Line"},{"value":["红旗","红旗演习","危险信号"],"key":"red flag"}]}

4.补充

<1> OKHTTP请求成功之后在onResponse方法中可以得到一个Response对象

           [1] 如果想获得返回的字符串结果则可以通过response.body().string()

           [2] 如果想获得返回结果的二进制数据的话可以通过response.body().bytes()

           [3] 如果想获得返回的InputStream的话可以通过response.body().byteStream()

且拿各种返回报文时,需要判断Response对象是否为空且是否成功。代码如上。

<2> OkHttp的主角们

[1] OkHttpClient

Factory for calls, which can be used to send HTTP requests and read their responses.
工厂生产者,负责生产calls。

  1. OkHttpClient mOkHttpClient = new OkHttpClient.Builder()
  2. .connectTimeout(DataConstant.nettimeout, TimeUnit.SECONDS)//连接时间
  3. .readTimeout(DataConstant.nettimeout, TimeUnit.SECONDS)//读时间
  4. .writeTimeout(DataConstant.nettimeout, TimeUnit.SECONDS)//写时间
  5. .build();

[2] Request

OkHttp的请求,通过Request.Builder().build创建, Request.Builder()配置请求信息,如请求方式get/post等、请求参数RequestBody、请求头header

Request request = new Request.Builder().addHeader("cookie", cookie).url(url).get().build();

[3] Call

调度者,Call作顶级接口,具体实现由RealCall负责。负责RequestResponse的桥梁作用,将Requestexecute()同步的方式执行输出Response, 或将Requestenqueue(callback)异步的方式加入调度。

  1. mOkHttpClient.newCall(request).enqueue(new Callback() {
  2. @Override
  3. public void onFailure(Call call, IOException e) {
  4. }
  5. @Override
  6. public void onResponse(Call call, Response response) throws IOException {
  7. }
  8. });

<3> OKHttp框架GitHub链接:https://github.com/square/okhttp

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/45585
推荐阅读
相关标签
  

闽ICP备14008679号