OkHttp详细用法

来源:互联网 发布:avtt天堂2015最新域名 编辑:程序博客网 时间:2024/05/21 03:24

引入依赖

<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);// 或者使用对象构建RequestBodyRequestBody 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. 我自己的头条号:开发技术专注者
0 0