1.form-data
即http請求中的multipart/form-data,它會將表單的數據處理爲一條消息,以標籤爲單元,用分隔符分開。既可以上傳鍵值對,也可以上傳文件。當上傳的字段是文件時,會有Content-Type來說明文件類型;content-disposition,用來說明字段的一些信息;由於有boundary隔離,所以multipart/form-data既可以上傳文件,也可以上傳鍵值對,它採用了鍵值對的方式,所以可以上傳多個文件。
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("name", "Tome")
.addFormDataPart("from", "China")
.addFormDataPart("hobby", "football")
.addFormDataPart("image", "logo-square.png",
RequestBody.create(MEDIA_TYPE_PNG, new File("website/static/logo-square.png")))
.build();
Request request = new Request.Builder()
.url("http://192.168.10.66/api/upload?name=242910b319c841bc804c53ef72d39990.jpg&ids=6143&type=2")
.method("POST", body)
.addHeader("x-sessionkey", "59534B58-2BC8-49BF-8B0E-2E3872C9F1DB")
.addHeader("x-userid", "752332")
.addHeader("User-Agent", "android")
.addHeader("x-tonce", "1592286822038")
.addHeader("x-timestamp", "1592286822038")
.build();
Response response = client.newCall(request).execute();
2.x-www-form-urlencoded
即application/x-www-from-urlencoded,會將表單內的數據轉換爲鍵值對,比如name=Tom&from=China&hobby=football。
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
RequestBody body = RequestBody.create(mediaType, "name=Tom&from=China&hobby=football");
Request request = new Request.Builder()
.url("http://192.168.10.66/api/upload?name=242910b319c841bc804c53ef72d39990.jpg&ids=6143&type=2")
.method("POST", body)
.addHeader("x-sessionkey", "59534B58-2BC8-49BF-8B0E-2E3872C9F1DB")
.addHeader("x-userid", "752332")
.addHeader("User-Agent", "android")
.addHeader("x-tonce", "1592286822038")
.addHeader("x-timestamp", "1592286822038")
.addHeader("Content-Type", "application/x-www-form-urlencoded")
.build();
Response response = client.newCall(request).execute();
multipart/form-data與x-www-form-urlencoded區別:
- multipart/form-data:既可以上傳文件等二進制數據,也可以上傳表單鍵值對,只是最後會轉化爲一條信息;
- x-www-form-urlencoded:只能上傳鍵值對,並且鍵值對都是間隔分開的。
3.raw
可以上傳任意格式的文本,可以上傳text、json、xml、html等。
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, "Hello world");
Request request = new Request.Builder()
.url("http://192.168.10.66/api/upload?name=242910b319c841bc804c53ef72d39990.jpg&ids=6143&type=2")
.method("POST", body)
.addHeader("x-sessionkey", "59534B58-2BC8-49BF-8B0E-2E3872C9F1DB")
.addHeader("x-userid", "88752332")
.addHeader("User-Agent", "android")
.addHeader("x-tonce", "1592286822038")
.addHeader("x-timestamp", "1592286822038")
.addHeader("Content-Type", "text/plain")
.build();
Response response = client.newCall(request).execute();
4.Binary
相當於Content-Type:application/octet-stream,只可以上傳二進制數據,通常用來上傳文件,由於沒有鍵值。所以,一次只能上傳一個文件。這個HTTP報文的body都是文件的信息,除此之外沒有額外多餘的信息。如下面是傳一張jpg圖片:
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("image/jpeg");
RequestBody body = RequestBody.create(mediaType, "<file contents here>");
Request request = new Request.Builder()
.url("http://192.168.10.66/api/upload?name=242910b319c841bc804c53ef72d39990.jpg&ids=6143&type=2")
.method("POST", body)
.addHeader("x-sessionkey", "59534B58-2BC8-49BF-8B0E-2E3872C9F1DB")
.addHeader("x-userid", "88752332")
.addHeader("User-Agent", "android")
.addHeader("x-tonce", "1592286822038")
.addHeader("x-timestamp", "1592286822038")
.addHeader("Content-Type", "image/jpeg")
.build();
Response response = client.newCall(request).execute();