首页 > 编程语言 >【Java】okHttp3 简单使用

【Java】okHttp3 简单使用

时间:2022-11-11 12:36:37浏览次数:52  
标签:Java request Request okHttp3 RequestBody call 简单 import new


之前用的RestTemplate,发现一个multipart的http请求始终发不成功,后面就试了下okHttp,发现真的好用,api太清爽了,记录一下使用:

package com.liyao;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.jetbrains.annotations.NotNull;
import org.junit.Test;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;


public class OhHttpTest {

private static final String host = "http://localhost.charlesproxy.com:8080";
// 最好用单例
private static OkHttpClient okHttpClient = new OkHttpClient();

@Test
public void post1() throws IOException {
// RequestBody 有三种构建方式:
// 1. FormBody.Builder,构建application/x-www-form-urlencoded类型的post表单
// 2. MultipartBody.Builder,构建multipart类型的body,多个内容合成到一个body里
// 3. RequestBody.create方法构建body体,传入两个参数:类型和内容
RequestBody body = new FormBody.Builder()
.add("key1", "value1")
.add("key1", "value1&key2=value2")
.addEncoded("key3", "value3?&=") // 这俩方法没看出啥区别,都会urlencode
.build();

Request request = new Request.Builder()
.url(host + "/rest/n/testApi/path")
.post(body)
.build();

Call call = okHttpClient.newCall(request);
call.execute();
}

@Test
public void post2() throws IOException {
RequestBody body = RequestBody.create("{}", MediaType.parse("application/json"));

Request request = new Request.Builder()
.url(host + "/rest/n/testApi/path")
.post(body)
.build();

Call call = okHttpClient.newCall(request);
call.execute();
}

@Test
public void multipart() throws IOException {
InputStream inputStream = new FileInputStream("src/test/resources/mapping.xlsx");
byte[] bs = inputStream.readAllBytes();

// 随便读一个excel文件,当做二进制流处理呗
RequestBody part1 = RequestBody.create(bs, MediaType.parse("application/octet-stream"));

// 通过构造方法指定boundary,一般不需要,只是知道有这么个用法
RequestBody multipart = new MultipartBody.Builder("MyBoundary")
.setType(MultipartBody.MIXED)
.addFormDataPart("m1", "v1")
.addFormDataPart("m2", "v2", part1)
.build();

Request request = new Request.Builder()
.url(host + "/rest/n/testApi/path")
.post(multipart)
.build();

Call call = okHttpClient.newCall(request);
call.execute();
}

@Test
public void get1() {
// get没有body
Request request = new Request.Builder()
.url(host + "/rest/n/testApi/hello")
.get()
.build();

Call call = okHttpClient.newCall(request);

// sync
try {
Response response = call.execute();
// process response
} catch (IOException e) {
e.printStackTrace();
}
}

@Test
public void get2() {
Request request = new Request.Builder()
.url(host + "/rest/n/testApi/hello")
.get()
.build();

Call call = okHttpClient.newCall(request);

// async
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
// process error
}

@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
// process response
}
});

// wait async result
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

 

标签:Java,request,Request,okHttp3,RequestBody,call,简单,import,new
From: https://blog.51cto.com/u_15873544/5844587

相关文章

  • 【Grpc(一)】Java 何如理解StreamObserver?
    刚开始接触Grpc时,桩代码里有许多StreamObserver类型,不太清楚是怎么用的,这里做一个记录。首先看下StreamObserver接口定义:publicinterfaceStreamObserver<V>{voidon......
  • 【Java】随机数原理 Random ThreadLocalRandom
    大致生成原理:随机数由seed经过一定的转换生成。需要提供初始seed。每一次生成随机数时,先由老seed生成新seed,再根据新seed生成新的随机数。由于算法是固定的,所以如果初始seed......
  • 【docker】Java应用 容器内存管理 -XX:+UseContainerSupport
    早期时候,容器内运行Java应用程序时,Jvm无法感知容器环境存在,所以对容器资源的限制比如内存或者cpu等都无法生效。原因是容器的资源管理使用了操作系统cgroup机制,但是Jvm无法......
  • 【Java】Instrumentation热更新 premain agentmain
    有两种办法:1)在java5中,可以利用jvm加载类的一个扩展点来实现类文件的动态修改。需要提供一个premain方法。缺点是只能在类文件加载且main方法执行之前修改,无法实现真正的运行......
  • 【zookeeper】java API 例子
    之前体验了命令行客户端,这次看一下javaAPI操作zk。server还是按照之前的配置,一个server1,server2和server3的伪集群。maven:这里使用maven管理zk的jar包,大致需要zk的jar和日......
  • 狂神说Javase基础学习1
    狂神学习博客1基本的DOS命令打开CMD的方式1.开始+系统+命令提示符2.win+R,进入运行窗口,输入cmd打开控制台3.在任意的文件夹下面,Shift+鼠标右键,进入命令行窗口4.资源管......
  • 【Java】内存模型 volatile
    java堆存储对象和数组,是一块线程共享数据区,但是实际线程运行的时候,对于用到的对象都会在线程私有空间即虚拟机栈保存一个副本,为了效率。这两快内存叫主内存和工作内存。java......
  • 【Java】内存区域与对象创建
    这块内容是java很基础的部分,涉及到JVM的设计原理,很久以前就看到过,这次需要区分线程私有和共享基本java的运行时数据区可以分为五大块:程序计数器,为线程私有,每一个线程都有一......
  • 【Java】split(
    java的split函数接受一个正则表达式的分隔符为参数,将string按照分隔符划分为一个数组。我们可能会忽略这个参数的要求,这里传入的分隔符并不是一个普通的字符串,而是一个正则......
  • 【Java】多线程 数目
    今天看到一篇文章,讲多线程数目的,很棒这个问题还是很容易被忽略的,就是多线程到底是为了什么?最开始学习多线程的时候,往往将多线程和性能高划等号,只要用了多线程就能提升性能,其......