HTTP上傳數據的方式和OKHttp的實現

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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章