OKHTTP3 简单使用(三) POST方法

无论是GET还是POST请求,最后都是有Call发起的,所以POST也可以有同步和异步两种方式,请求时步骤与GET基本一致

与GET不同的是,在构建Request的时候,需要传一个RequestBody对象,RequestBody用来添加请求参数以及制定MideaType(Content-Type)

POST请求-普通参数请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
OkHttpClient client = new OkHttpClient();
FormBody.Builder formBodyBuilder = new FormBody.Builder();
formBodyBuilder.add("Param name1", "Param value1");
formBodyBuilder.add("Param name2", "Param value2");
Request request = new Request.Builder()
.url(url)
.post(formBodyBuilder.build())
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}

@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
}
});

与GET对比,POST请求多了一个FormBody,构建Request的时候多了一个post()
使其GET请求构建Request的时候是有一个get()的

1
2
3
4
Request request = new Request.Builder()
.url(url)
.get()
.build();

只不过请求时默认就是GET请求,因此可以省略不写
POST请求的时候需要传递一个RequestBody,FormBody继承自RequestBody

POST请求-提交Json String

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json; charset=utf-8")
RequestBody requestBody = FormBody.create(mediaType, jsonString);
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}

@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
}
});

与普通参数请求对比,Json String的提交多了一个MediaType,普通参数请求的时候MediaType为

1
MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded; charset=utf-8")

FormBody默认的MediaType就是application/x-www-form-urlencoded; charset=utf-8因此也可以省略不写

POST请求-以流方式请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new RequestBody() {
@Override public MediaType contentType() {
return MediaType.parse("text/x-markdown; charset=utf-8");
}

@Override public void writeTo(BufferedSink sink) throws IOException {
sink.writeUtf8("Users\n");
for (int i = 1; i < 100; i++) {
sink.writeUtf8(String.format("Name%d\n", i));
}
}
};
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}

@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
}
});

RequestBody的内容通过流的方式写入,然后将流写进Okio的BufferedSink中进行提交
如果需要使用OutputStream可以通过BufferedSink.outputStream()进行获取