OkHttp详细用法

引入依赖

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.1.0</version>
</dependency>

发起GET请求

首先,根据url和参数构建get请求的完整url:

private String builderGetUrl(String url, Map<String, String> params) {
    StringBuilder result = new StringBuilder(url);
    int index = url.lastIndexOf("?");
    if (index == -1) {
        result.append("?");
    }
    for (Map.Entry<String, String> entry : params.entrySet()) {
        result.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
    }
    if (!params.isEmpty()) {
        result.deleteCharAt(result.length() - 1);
    }
    return result.toString();
}

其次,发起GET请求,

OkHttpClient client = new OkHttpClient.Builder().build();

Request.Builder requestBuilder = new Request.Builder();
requestBuilder.addHeader("Cookie", "P00004=XXXXXX");  // 添加请求头

Map<String, String> params = Maps.newHashMap();
params.put("vid", "0749112147010284");
params.put("options", "{\"0811385077020277\":[\"0966478616030212\"]}");

Request request = requestBuilder.url(builderGetUrl(voteUrl, params)).get().build();  // .get()可有可无

Response response = client.newCall(request).execute();
// 或者异步获取返回结果:
client.newCall(request).enqueue(
        new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                queue.add(e.getMessage());
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String responseBody = response.body().string();
                System.out.println(responseBody);
            }
        });

POST请求

要发送post请求一定要有RequestBody,RequestBody可以使用FormBody、MultipartBody或者RequestBody的各种create()工厂方法来创建,

OkHttpClient client = new OkHttpClient().Builder().build();
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
String json = "{\"0811385077020277\":[\"0966478616030212\"]}";
RequestBody body = RequestBody.create(JSON, json);
// 或者使用对象构建RequestBody
RequestBody body = new RequestBody() {
    @Override
    public void writeTo(BufferedSink sink) throws IOException {
        sink.write(buildRequest().toByteArray());  // buildRequest()返回一个自己构造的对象,转为字节直接存放在request body里面
    }
    @Override
    public MediaType contentType() {
        return MediaType.parse("application/x-protobuf");
    }
};
Request request = new Request.Builder()
    .url(url)
    .post(body)
    .build();
Response response = client.newCall(request).execute();

构建RequestBody

RequestBody是一个抽象类,其中有很多create()工具方法可以直接创建出一个RequestBody。同时也可以自己实现writeTo()方法和contentType()方法来构造RequestBody:

RequestBody body = new RequestBody() {
    @Override
    public void writeTo(BufferedSink sink) throws IOException {
        sink.write(buildRequest().toByteArray());  // buildRequest()返回一个自己构造的对象,转为字节直接存放在request body里面
    }
    @Override
    public MediaType contentType() {
        return MediaType.parse("application/x-protobuf");
    }
};

FormBody

FormBody是RequestBody的一种实现。要想post请求像网页一样提交一个form表单,则需要用到FormBody。

FormBody body = new FormBody.Builder()
    .add("name", "value")
    .addEncoded("name", "value")
    .build();

MultipartBody

总所周知,如果需要在网页表单上提交一个文件,需要把表单设置为”multipart/form-data”。在OkHttp中则需要使用到MultipartBody。

其中,MultipartBody的内容类型有以下几种:

public static final MediaType MIXED = MediaType.parse("multipart/mixed");
public static final MediaType ALTERNATIVE = MediaType.parse("multipart/alternative");
public static final MediaType DIGEST = MediaType.parse("multipart/digest");
public static final MediaType PARALLEL = MediaType.parse("multipart/parallel");
public static final MediaType FORM = MediaType.parse("multipart/form-data");

其次,构建MultipartBody,

MultipartBody body = new MultipartBody.Builder()
        .addFormDataPart("name", "value")
        .addFormDataPart(
                "name",
                "filetest",
                RequestBody.create(
                        MediaType.parse("application/json"),
                        new File(
                                "C:\\Users\\yorkchen\\Desktop\\voteUrl.txt")))
        .addPart(
                Headers.of("Content-Disposition",
                        "form-data; name=\"title\""),
                RequestBody.create(null, "Square Logo")).build();

System.out.println(body);

for (Part part : body.parts()) {
    try {
        Class<?> cl = part.getClass();
        Field headersField = cl.getDeclaredField("headers");
        Field bodyField = cl.getDeclaredField("body");
        headersField.setAccessible(true);
        bodyField.setAccessible(true);
        System.out.println(((Headers) headersField.get(part)));
        System.out.println(((RequestBody) bodyField.get(part)));
    } catch (NoSuchFieldException | SecurityException
            | IllegalArgumentException | IllegalAccessException e) {
        e.printStackTrace();
    }
}

/**
 * output:
 * okhttp3.MultipartBody@366e2eef
 * Content-Disposition: form-data; name="name"
 *
 * okhttp3.RequestBody$2@3cbbc1e0
 * Content-Disposition: form-data; name="name"; filename="filetest"
 *
 * okhttp3.RequestBody$3@35fb3008
 * Content-Disposition: form-data; name="title"
 *
 * okhttp3.RequestBody$2@7225790e
 */

最后,再看一个RequestBody示例,

RequestBody实例

喜欢的可以关注微信公众号:
这里写图片描述

参考

  1. 我自己的头条号:开发技术专注者
发布了14 篇原创文章 · 获赞 37 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/c315838651/article/details/71915707