詳解Android中使用OkHttp發送HTTP的post請求的方法_Android

來源:互聯網
上載者:User

HTTP POST 和 PUT 請求可以包含要提交的內容。只需要在建立 Request 對象時,通過 post 和 put 方法來指定要提交的內容即可。
HTTP POST 請求的基本樣本:

public class PostString {  public static void main(String[] args) throws IOException {  OkHttpClient client = new OkHttpClient();  MediaType MEDIA_TYPE_TEXT = MediaType.parse("text/plain");  String postBody = "Hello World";  Request request = new Request.Builder()      .url("http://www.baidu.com")      .post(RequestBody.create(MEDIA_TYPE_TEXT, postBody))      .build();  Response response = client.newCall(request).execute();  if (!response.isSuccessful()) {    throw new IOException("伺服器端錯誤: " + response);  }  System.out.println(response.body().string());  }}

以 String 類型提交內容只適用於內容比較小的情況。當請求內容較大時,應該使用流來提交。

Post方式提交流

以流的方式POST提交請求體。請求體的內容由流寫入產生。這個例子是流直接寫入 Okio 的BufferedSink。你的程式可能會使用 OutputStream ,你可以使用 BufferedSink.outputStream() 來擷取。

public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");private final OkHttpClient client = new OkHttpClient();public void run() throws Exception { RequestBody requestBody = new RequestBody() {  @Override public MediaType contentType() {   return MEDIA_TYPE_MARKDOWN;  }  @Override public void writeTo(BufferedSink sink) throws IOException {   sink.writeUtf8("Numbers\n");   sink.writeUtf8("-------\n");   for (int i = 2; i <= 997; i++) {  sink.writeUtf8(String.format(" * %s = %s\n", i, factor(i)));   }  }  private String factor(int n) {   for (int i = 2; i < n; i++) {  int x = n / i;  if (x * i == n) return factor(x) + " × " + i;   }   return Integer.toString(n);  } }; Request request = new Request.Builder()   .url("https://api.github.com/markdown/raw")   .post(requestBody)   .build(); Response response = client.newCall(request).execute(); if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); System.out.println(response.body().string());}

Post方式提交檔案

以檔案作為請求體是十分簡單的。

public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");private final OkHttpClient client = new OkHttpClient();public void run() throws Exception { File file = new File("README.md"); Request request = new Request.Builder()   .url("https://api.github.com/markdown/raw")   .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file))   .build(); Response response = client.newCall(request).execute(); if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); System.out.println(response.body().string());}

Post方式提交表單

使用 FormEncodingBuilder 來構建和HTML <form> 標籤相同效果的請求體。索引值對將使用一種HTML相容形式的URL編碼來進行編碼。

private final OkHttpClient client = new OkHttpClient();public void run() throws Exception { RequestBody formBody = new FormEncodingBuilder()   .add("search", "Jurassic Park")   .build(); Request request = new Request.Builder()   .url("https://en.wikipedia.org/w/index.php")   .post(formBody)   .build(); Response response = client.newCall(request).execute(); if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); System.out.println(response.body().string());}

Post方式提交分塊請求

MultipartBuilder 可以構建複雜的請求體,與HTML檔案上傳形式相容。多塊請求體中每塊請求都是一個請求體,可以定義自己的要求標頭。這些要求標頭可以用來描述這塊請求,例如他的 Content-Disposition 。如果 Content-Length 和 Content-Type 可用的話,他們會被自動添加到要求標頭中。

private static final String IMGUR_CLIENT_ID = "...";private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");private final OkHttpClient client = new OkHttpClient();public void run() throws Exception { // Use the imgur image upload API as documented at https://api.imgur.com/endpoints/image RequestBody requestBody = new MultipartBuilder()   .type(MultipartBuilder.FORM)   .addPart(     Headers.of("Content-Disposition", "form-data; name=\"title\""),     RequestBody.create(null, "Square Logo"))   .addPart(     Headers.of("Content-Disposition", "form-data; name=\"image\""),     RequestBody.create(MEDIA_TYPE_PNG, new File("website/static/logo-square.png")))   .build(); Request request = new Request.Builder()   .header("Authorization", "Client-ID " + IMGUR_CLIENT_ID)   .url("https://api.imgur.com/3/image")   .post(requestBody)   .build(); Response response = client.newCall(request).execute(); if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); System.out.println(response.body().string());}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.