一、
1、Content-Type的格式:
Content-Type:type/subtype ;parameter
type:主类型,任意的字符串,如text,如果是*号代表所有;
subtype:子类型,任意的字符串,如html,如果是*号代表所有,用“/”与主类型隔开;
parameter:可选参数,如charset,boundary等。
2、RequestBody的数据格式都要指定Content-Type,常见的有三种:
-
application/x-www-form-urlencoded 数据是个普通表单
-
multipart/form-data 数据里有文件
-
application/json 数据是个json
二、
1、RequestBody body = new FormBody.Builder()
.add("键", "值")
.add("键", "值")
...
.build();
上面测创建,并没有指定Content-Type,因为FormBody继承了RequestBody,它已经指定了数据类型为application/x-www-form-urlencoded。
2、如果表单是个json:
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON, "你的json");
3、如果数据包含文件:
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("image/png"), file))
.build();
三、示例
1、提交文件:
MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
OkHttpClient okHttpClient = new OkHttpClient();
//构建指定文件实例
File file = new File("/storage/emulated/0/test.txt");
Request request = new Request.Builder()
.url("https://api.github.com/markdown/raw")
//传入文件实例
.post(RequestBody.create(mediaType, file))
.build();
Call call=okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
GyLog.d( "onFailure: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
GyLog.d(" response.body() = "+response.body().string());
GyLog.d(" response.code() = "+response.code());
GyLog.d(" response.message() = "+response.message());
}
});