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();
    }
}
posted @ 2023-03-09 23:53  沙里  阅读(550)  评论(0)    收藏  举报