OkHttp,一次无奈的使用

标签: okhttp 无奈 | 发表时间:2020-06-05 07:39 | 作者:严阵以待
出处:https://juejin.im/welcome/backend

一次使用OKHTTP的心痛历程

最近由于一些不得已的原因,接触到了OKHttp,说起来也挺Dan疼的,之前同事将生产附件上传地址配置成了测试地址,还好数量不多,没有造成太大的影响,况且的是这位同事又离职了,当时只能在心中 默默的问候了他N遍,当然问候完了之后,也不得不继续数据同步的工作。

OKHTTP官方地址: okHttp

本文源地址: 一次使用OKHTTP的心痛历程


介绍

由于OkHttp官网的介绍十分详细,这里只能贴上一段翻译过后的introduce:

HTTP是现代应用网络的一种方式。这就是我们交换数据和媒体的方式。高效地使用HTTP可以让你的东西更快地加载并节省带宽。

OkHttp是一个高效的Http客户端,在默认的情况下:

  • HTTP / 2支持允许对同一主机的所有请求共享一个套接字。
  • 连接池可减少请求延迟(如果HTTP / 2不可用)。
  • 透明的GZIP缩小了下载大小。
  • 响应缓存可以完全避免网络重复请求。

不过在我使用下来,OkHttp比 apache-http 好用太多,层次结构较直观。


使用场景

本次场景是将上传到测试环境的文件信息,下载到本地,然后再上传到生产环境。

解决过程如下:

  • 将错误数据从数据库表中粘贴到本地新建的一个Excel文件中。(毕竟直接连接数据库风险更大)

  • 读取Excel内的信息,获取文件地址。

  • 请求文件地址,获取到流文件信息。

  • 拿到流文件信息,拼接上传数据,上传到新的生产环境中。

  • 上传完成后,获取到生产环境文件地址。

  • 获取到生产文件地址的同时,生成更新的SQL语句。

  • 到数据库中执行SQL语句。


使用过程

本次使用没有搭建新的工程,直接再 src/test/java 目录下新建一个Java类。

引入OKHttp的依赖:

  <dependency>
    <groupId>com.squareup.okhttp3groupId>
    <artifactId>okhttpartifactId>
    <version>3.3.1version>
dependency>
复制代码

在引入了 okhttp 的jar包后,基本上就可以开始随心所欲的进行自己任意丧心病狂的Http请求了。

比如,它直接同步和异步的请求:

同步GET

    private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    Request request = new Request.Builder()
        .url("https://publicobject.com/helloworld.txt")
        .build();

    try (Response response = client.newCall(request).execute()) {
      if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

      Headers responseHeaders = response.headers();
      for (int i = 0; i < responseHeaders.size(); i++) {
        System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
      }

      System.out.println(response.body().string());
    }
  }
复制代码

异步GET

   private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    Request request = new Request.Builder()
        .url("http://publicobject.com/helloworld.txt")
        .build();

    client.newCall(request).enqueue(new Callback() {
      @Override public void onFailure(Call call, IOException e) {
        e.printStackTrace();
      }

      @Override public void onResponse(Call call, Response response) throws IOException {
        try (ResponseBody responseBody = response.body()) {
          if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

          Headers responseHeaders = response.headers();
          for (int i = 0, size = responseHeaders.size(); i < size; i++) {
            System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
          }

          System.out.println(responseBody.string());
        }
      }
    });
  }
复制代码

Header信息

  private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    Request request = new Request.Builder()
        .url("https://api.github.com/repos/square/okhttp/issues")
        .header("User-Agent", "OkHttp Headers.java")
        .addHeader("Accept", "application/json; q=0.5")
        .addHeader("Accept", "application/vnd.github.v3+json")
        .build();

    try (Response response = client.newCall(request).execute()) {
      if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

      System.out.println("Server: " + response.header("Server"));
      System.out.println("Date: " + response.header("Date"));
      System.out.println("Vary: " + response.headers("Vary"));
    }
  }
复制代码

POST请求流信息

  public static final MediaType MEDIA_TYPE_MARKDOWN
      = MediaType.parse("text/x-markdown; charset=utf-8");

  private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    RequestBody requestBody = new RequestBody() {
      @Override public MediaType contentType() {
        return MEDIA_TYPE_MARKDOWN;
      }

      @Override public void writeTo(BufferedSink sink) throws IOException {
        sink.writeUtf8("Numbers\n");
        sink.writeUtf8("-------\n");
        for (int i = 2; i <= 997; i++) {
          sink.writeUtf8(String.format(" * %s = %s\n", i, factor(i)));
        }
      }

      private String factor(int n) {
        for (int i = 2; i < n; i++) {
          int x = n / i;
          if (x * i == n) return factor(x) + " × " + i;
        }
        return Integer.toString(n);
      }
    };

    Request request = new Request.Builder()
        .url("https://api.github.com/markdown/raw")
        .post(requestBody)
        .build();

    try (Response response = client.newCall(request).execute()) {
      if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

      System.out.println(response.body().string());
    }
  }
复制代码

POST请求File信息

    public static final MediaType MEDIA_TYPE_MARKDOWN
      = MediaType.parse("text/x-markdown; charset=utf-8");

  private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    File file = new File("README.md");

    Request request = new Request.Builder()
        .url("https://api.github.com/markdown/raw")
        .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file))
        .build();

    try (Response response = client.newCall(request).execute()) {
      if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

      System.out.println(response.body().string());
    }
  }
复制代码

Post表单提交

   private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    RequestBody formBody = new FormBody.Builder()
        .add("search", "Jurassic Park")
        .build();
    Request request = new Request.Builder()
        .url("https://en.wikipedia.org/w/index.php")
        .post(formBody)
        .build();

    try (Response response = client.newCall(request).execute()) {
      if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

      System.out.println(response.body().string());
    }
  }
复制代码

POST多个Body请求

    /**
   * The imgur client ID for OkHttp recipes. If you're using imgur for anything other than running
   * these examples, please request your own client ID! https://api.imgur.com/oauth2
   */
  private static final String IMGUR_CLIENT_ID = "...";
  private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");

  private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    // Use the imgur image upload API as documented at https://api.imgur.com/endpoints/image
    RequestBody requestBody = new MultipartBody.Builder()
        .setType(MultipartBody.FORM)
        .addFormDataPart("title", "Square Logo")
        .addFormDataPart("image", "logo-square.png",
            RequestBody.create(MEDIA_TYPE_PNG, new File("website/static/logo-square.png")))
        .build();

    Request request = new Request.Builder()
        .header("Authorization", "Client-ID " + IMGUR_CLIENT_ID)
        .url("https://api.imgur.com/3/image")
        .post(requestBody)
        .build();

    try (Response response = client.newCall(request).execute()) {
      if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

      System.out.println(response.body().string());
    }
  }
复制代码

因为使用过程中大多数都是按照官网的例子来进行,所以这次使用的代码是类似于官方提供的例子,当然也是不太好意思贴出来,哈哈。


总结

OkHttp算得上是相见恨晚,之前一遍一遍写 apache-http 的时候就觉得 apche 有点冗余,就是想有一个轻量级的,比较好上手,容易懂的http-client,不过现在接触到了 okhttp,还是得感谢那位配错地址的兄弟。

以上更多请求例子可以访问: OKhttp-Request-example

参考资料:

OkHttp.io
OKhttp-Request-example
OKHttp-Github

相关 [okhttp 无奈] 推荐:

OkHttp,一次无奈的使用

- - 掘金后端
一次使用OKHTTP的心痛历程. 最近由于一些不得已的原因,接触到了OKHttp,说起来也挺Dan疼的,之前同事将生产附件上传地址配置成了测试地址,还好数量不多,没有造成太大的影响,况且的是这位同事又离职了,当时只能在心中 默默的问候了他N遍,当然问候完了之后,也不得不继续数据同步的工作. OKHTTP官方地址: okHttp.

Rxjava+ReTrofit+okHttp深入浅出-终极封装

- - CSDN博客推荐文章
Rxjava+ReTrofit+okHttp深入浅出-终极封装. 学习Rxjava和retrofit已经很长时间了,功能确实很强大,但是使用起来还是有点复杂,代码的重复性太高,所以决定把基于retrofit和rxjava的处理统一封装起来,实现的功能:. 1.Retrofit+Rxjava+okhttp基本使用方法.

Android Https相关完全解析 当OkHttp遇到Https

- - CSDN博客推荐文章
本文出自: 【张鸿洋的博客】. 其实这篇文章理论上不限于okhttp去访问自签名的网站,不过接上篇博文了,就叫这个了. 首先要了解的事,okhttp默认情况下是支持https协议的网站的,比如 https://www.baidu.com, https://github.com/hongyangAndroid/okhttp-utils等,你可以直接通过okhttp请求试试.

OkHttp透明压缩,收获性能10倍,外加故障一枚

- - 掘金后端
原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处. 要使用 OkHttp,一定要知道它的 透明压缩,否则死都不知道怎么死的;或者活也不知道为什么活的不舒坦. OkHttp在发送请求的时候,会自动加入gzip请求头 Accept-Encoding:gzip. 所以,当返回的数据带有gzip响应头时 Content-Encoding=gzip,OkHttp会自动帮我们解压数据.

《无奈》之中国大学生

- susanna.fang - 极视智库专家——郎咸平
据媒体报道,开学季到来,除了数码城一如既往的热闹之外,今年汽车4S店也提前进入“金九银十”. 买几件新衣服,买最新款的智能手机,......>>点击查看新浪博客原文.

SNS 是对现实社交无奈的拙劣模仿

- inecho - 牛博山寨 编辑推荐
天翼按:这篇短文起源于整理 Twitter Following 时面对各种各样取舍后感到的烦躁. 这通牢骚原先要发在 Google+ ,后来越写越长,于是干脆改成博文. 当我试图用 Google+ Circle 的理念来处理 Twitter Friends 时,发现这是完全徒劳的. 注册不同的账号、用不同的 Lists 、以不同的分类标准 Follow …… 统统不可行,统统有问题.

摇出来的谬误:买车为什么这么无奈

- 程漱铭 - 极视智库专家——郎咸平
    2010年12月23日,北京治堵摇号方案公布,民众对这一突如其来的“圣诞礼物”显然并不中意. 而半年后的今天,首批摇号指标已经到期,仍然有1000......>>点击查看新浪博客原文.

无奈何望着天,叹叹气把头摇

- Dre.J - 【枪·东东枪的枪】
昨天去录一个视频的访谈,聊“创意”. 录的一步一个坎儿,隔三五分钟我就得叫停一次. 听主持人介绍我是某某公司的什么什么人,挺不习惯. 主持人说创作者经常会因不被人理解而苦恼,怎么办. 我说这事儿是必然的,开始从事创作工作之前就该料到的. 后来想,不只是创作者,恐怕每个人都不能指望自己“被理解”. 别人没有理解你的义务,不被理解再正常不过.

小美女无奈之下靠枕头解开束缚

- kaletoppest - 无聊哦
车停的太挤,小软酥胸美女大发雷霆,无奈之下靠枕头解开束缚,太机灵了这妹子,能想到这么酷的方法 ~·. 查看原文  |  发表评论(10). © 疾风 for 无聊哦 | 原文链接 | 搞笑哦 | 淘宝网上卖疯了的东东. 订阅 无聊哦 http://feed.wuliaoo.com. 订阅 搞笑哦 http://feed.gaoxiaoo.com.

联通3G薄膜卡的无奈选择

- 峰 - 付亮的歪评瞎论
微博传联通推出“薄膜卡”,大致介绍如下(转自新浪科技):. 用户在联通营业厅购买一张薄膜卡,由于卡片很薄,可粘贴于GSM/WCDMA制式的国内外各大运营商的SIM/USIM卡上,一同插入手机即可使用,手机通过内置超薄SIM卡菜单自由选择使用薄膜卡或原号卡,无需更换手机和SIM卡即可实现“一机双号”功能.