http客户端框架okhttpclient3的使用指南笔记
首先说明我使用的版本:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.1</version>
</dependency>
发一个 get 请求
String url = "http://127.0.0.1:80";
Request request = new Request.Builder().url(url).header("func", "test").build();
OkHttpClient okHttpClient = new OkHttpClient();
Call call = okHttpClient.newCall(request);
try {
// 执行请求
Response response = call.execute();
// 响应码在 200 - 299 均返回 true
assertTrue(response.isSuccessful(), "请求失败");
// 获取请求头
assertEquals("test", request.header("func"), "获取请求头的功能参数");
// 获取请求头的原生字符串,okhttpclient 自己添加的头不会输出
assertTrue(request.headers().toString().length() > 0);
// response code
assertEquals(200, response.code(), "http响应码不是200");
// http response code reason
assertEquals("OK", response.message(), "响应码描述不是OK");
// 获取响应协议
assertEquals("http/1.1", response.protocol().toString(), "响应协议不对");
assertEquals("HTTP_1_1", response.protocol().name(), "响应协议不对");
// 获取响应头
assertEquals(": text/html; charset=UTF-8", response.header("Content-type"), "响应头内容格式不正确");
assertEquals(": text/html; charset=UTF-8", response.headers().get("Content-type"));
// 获取响应头数组
assertEquals(1, response.headers("Content-type").size(), "这个响应头内容不止1个");
assertEquals(": text/html; charset=UTF-8", response.headers("Content-type").get(0));
// 获取带换行符的响应头内容
assertTrue(response.headers().toString().length() > 0);
// 响应体内容
ResponseBody responseBody = response.body();
if (responseBody != null) {
assertTrue(responseBody.string().length() > 0);
}
} catch (IOException e) {
e.printStackTrace();
}
发起 post json 请求
public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
@Test
void postJson() {
// 创建请求
String url = "http://127.0.0.1:80";
String postBodyJson = "{\"name\":\"tony\",\"age\":18}";
// 构造参数
RequestBody requestBody = RequestBody.create(postBodyJson, JSON);
Request request = new Request.Builder().url(url).header("token", "123abc").post(requestBody).build();
OkHttpClient okHttpClient = new OkHttpClient();
Call call = okHttpClient.newCall(request);
try {
// 执行请求
Response response = call.execute();
assertTrue(response.isSuccessful(), "请求失败");
// 将请求体内容写入 buffer
Buffer buffer = new Buffer();
Objects.requireNonNull(request.body()).writeTo(buffer);
// 获取请求体内容格式,然后从 buffer 中读出
MediaType contentType = requestBody.contentType();
Charset charset = Objects.requireNonNull(contentType).charset();
assert charset != null;
assertEquals(postBodyJson, buffer.readString(charset), "请求体写入跟读出不一致");
} catch (IOException e) {
e.printStackTrace();
}
}
发送 post application/x-www-form-urlencoded 请求,指定编码类型
public static final MediaType FORM = MediaType.get("application/x-www-form-urlencoded; charset=utf-8");
@Test
void postJson() {
// 创建请求
String url = "http://127.0.0.1:80";
// 构造参数
Map<String, Object> stringObjectMap = new HashMap<>(2);
stringObjectMap.put("name", "tony");
stringObjectMap.put("age", 18);
// 塞入参数
StringBuilder stringBuilder = new StringBuilder();
stringObjectMap.forEach((key, val) -> {
if (0 != stringBuilder.length()) {
stringBuilder.append("&");
}
stringBuilder.append(String.format("%s=%s", key, val));
});
// 请求参数构造请求体
RequestBody requestBody = RequestBody.create(stringBuilder.toString(), FORM);
Request request = new Request.Builder().url(url).header("token", "123abc").post(requestBody).build();
OkHttpClient okHttpClient = new OkHttpClient();
Call call = okHttpClient.newCall(request);
try {
// 执行请求
Response response = call.execute();
assertTrue(response.isSuccessful(), "请求失败");
// 将请求体内容写入 buffer
Buffer buffer = new Buffer();
Objects.requireNonNull(request.body()).writeTo(buffer);
// 获取请求体内容格式,然后从 buffer 中读出
MediaType contentType = requestBody.contentType();
Charset charset = Objects.requireNonNull(contentType).charset();
assert charset != null;
assertEquals("name=tony&age=18", buffer.readString(charset), "请求体写入跟读出不一致");
} catch (IOException e) {
e.printStackTrace();
}
}
发送 post application/x-www-form-urlencoded 请求,不指定编码类型
@Test
void postJson() {
// 创建请求
String url = "http://127.0.0.1:80";
// 构造参数
Map<String, Object> stringObjectMap = new HashMap<>(2);
stringObjectMap.put("name", "tony");
stringObjectMap.put("age", 18);
// 塞入参数
FormBody.Builder builder = new FormBody.Builder();
stringObjectMap.forEach((key, val) -> {
builder.add(key, String.valueOf(val));
});
// 请求参数构造请求体
RequestBody requestBody = builder.build();
Request request = new Request.Builder().url(url).header("token", "123abc").post(requestBody).build();
OkHttpClient okHttpClient = new OkHttpClient();
Call call = okHttpClient.newCall(request);
try {
// 执行请求
Response response = call.execute();
assertTrue(response.isSuccessful(), "请求失败");
// 将请求体内容写入 buffer
Buffer buffer = new Buffer();
Objects.requireNonNull(request.body()).writeTo(buffer);
// 获取请求体内容格式,然后从 buffer 中读出
MediaType contentType = requestBody.contentType();
Charset charset = Objects.requireNonNull(contentType).charset();
assertNull(charset);
assertEquals("name=tony&age=18", buffer.readString(StandardCharsets.UTF_8), "请求体写入跟读出不一致");
assertNotEquals("name=tony&age=18", buffer.readString(Charset.forName("UTF-8")), "请求体写入跟读出不一致");
} catch (IOException e) {
e.printStackTrace();
}
}

浙公网安备 33010602011771号