无论是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()进行获取