引入依赖
<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示例,
喜欢的可以关注微信公众号: