在android中使用OkHttp框架处理网络请求

来源:互联网 发布:淘宝店铺的客服电话 编辑:程序博客网 时间:2024/05/22 03:17

OkHttp网络处理框架,分成下面几个使用过程:

1.Get:

同步Get

private final OkHttpClient client = new OkHttpClient(); public void run() throws Exception {    Request request = new Request.Builder()        .url("http://publicobject.com/helloworld.txt")        .build();    Response response = client.newCall(request).execute();    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);    Headers responseHeaders = response.headers();    for (int i = 0; i < responseHeaders.size(); i++) {      System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));    }    System.out.println(response.body().string()); }

 异步Get

 private final OkHttpClient client = new OkHttpClient(); public void run() throws Exception {   Request request = new Request.Builder()        .url("http://publicobject.com/helloworld.txt")        .build();    client.newCall(request).enqueue(new Callback() {      @Override public void onFailure(Call call, IOException e) {        e.printStackTrace();      }      @Override public void onResponse(Call call, Response response) throws IOException {        if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);        Headers responseHeaders = response.headers();        for (int i = 0, size = responseHeaders.size(); i < size; i++) {          System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));        }        System.out.println(response.body().string());      }    }); }

2.Post:

a.Post a Body only:String

不要超过1M 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 {    String postBody = ""        + "Releases\n"        + "--------\n"        + "\n"        + " * _1.0_ May 6, 2013\n"        + " * _1.1_ June 15, 2013\n"        + " * _1.2_ August 11, 2013\n";    Request request = new Request.Builder()        .url("https://api.github.com/markdown/raw")        .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, postBody))        .build();    Response response = client.newCall(request).execute();    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);    System.out.println(response.body().string());  }

b.Post a stream

大小没有限制 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());  }

c.Post a File

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());  }

d.Post a form,简单键值对

private final OkHttpClient client = new OkHttpClient();  public void run() throws Exception {    RequestBody formBody = new FormBody.Builder()        .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());  }

e.Post混合参数类型

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 MultipartBody.Builder()        .setType(MultipartBody.FORM)        .addFormDataPart("title", "Square Logo")        .addFormDataPart("image", "logo-square.png",            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());}

3.解析response成Json:

private final OkHttpClient client = new OkHttpClient();private final Gson gson = new Gson();  public void run() throws Exception {    Request request = new Request.Builder()        .url("https://api.github.com/gists/c2a7c39532239ff261be")        .build();    Response response = client.newCall(request).execute();    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);    Gist gist = gson.fromJson(response.body().charStream(), Gist.class);    for (Map.Entry<String, GistFile> entry : gist.files.entrySet()) {      System.out.println(entry.getKey());      System.out.println(entry.getValue().content);    }  }  static class Gist {    Map<String, GistFile> files;  }  static class GistFile {    String content;  }

4.缓存response:

缓存的访问不能同一时间进行。
缓存对象CacheCache只能有一个。即是一个client配置一个CacheCache,不能有2个CacheCache实例
缓存配置可以在请求头中设置:
Cache-Control: max-stale=3600
Cache-Control: max-age=9600
CacheControl.FORCE_NETWORK,只从网络取
CacheControl.FORCE_CACHE,只从文件缓存中取,在该模式下,访问网络会出现504 Unsatisfiable Request response.

  private final OkHttpClient client;  public CacheResponse(File cacheDirectory) throws Exception {    int cacheSize = 10 * 1024 * 1024; // 10 MiB    Cache cache = new Cache(cacheDirectory, cacheSize);    client = new OkHttpClient.Builder()        .cache(cache)        .build();  }  public void run() throws Exception {    Request request = new Request.Builder()        .url("http://publicobject.com/helloworld.txt")        .build();    Response response1 = client.newCall(request).execute();    if (!response1.isSuccessful()) throw new IOException("Unexpected code " + response1);    String response1Body = response1.body().string();    System.out.println("Response 1 response:          " + response1);    System.out.println("Response 1 cache response:    " + response1.cacheResponse());    System.out.println("Response 1 network response:  " + response1.networkResponse());    Response response2 = client.newCall(request).execute();    if (!response2.isSuccessful()) throw new IOException("Unexpected code " + response2);    String response2Body = response2.body().string();    System.out.println("Response 2 response:          " + response2);    System.out.println("Response 2 cache response:    " + response2.cacheResponse());    System.out.println("Response 2 network response:  " + response2.networkResponse());    System.out.println("Response 2 equals Response 1? " + response1Body.equals(response2Body));  }

5,添加请求头:

private final OkHttpClient client = new OkHttpClient();  public void run() throws Exception {    Request request = new Request.Builder()        .url("https://api.github.com/repos/square/okhttp/issues")        .header("User-Agent", "OkHttp Headers.java")        .addHeader("Accept", "application/json; q=0.5")        .addHeader("Accept", "application/vnd.github.v3+json")        .build();    Response response = client.newCall(request).execute();    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);    System.out.println("Server: " + response.header("Server"));    System.out.println("Date: " + response.header("Date"));    System.out.println("Vary: " + response.headers("Vary"));  }

6.取消请求:

private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); private final OkHttpClient client = new OkHttpClient(); public void run() throws Exception {    Request request = new Request.Builder()        .url("http://httpbin.org/delay/2") // This URL is served with a 2 second delay.        .build();    final long startNanos = System.nanoTime();    final Call call = client.newCall(request);    // Schedule a job to cancel the call in 1 second.    executor.schedule(new Runnable() {      @Override public void run() {        System.out.printf("%.2f Canceling call.%n", (System.nanoTime() - startNanos) / 1e9f);        call.cancel();  //取消请求,        System.out.printf("%.2f Canceled call.%n", (System.nanoTime() - startNanos) / 1e9f);      }    }, 1, TimeUnit.SECONDS);    try {      System.out.printf("%.2f Executing call.%n", (System.nanoTime() - startNanos) / 1e9f);      Response response = call.execute();      System.out.printf("%.2f Call was expected to fail, but completed: %s%n",          (System.nanoTime() - startNanos) / 1e9f, response);    } catch (IOException e) { //如果在取消时,有线程在读写response,则会出现异常      System.out.printf("%.2f Call failed as expected: %s%n",          (System.nanoTime() - startNanos) / 1e9f, e);    }  }

7.设置超时:

连接读写超时设置,
private final OkHttpClient client;public ConfigureTimeouts() throws Exception {    client = new OkHttpClient.Builder()        .connectTimeout(10, TimeUnit.SECONDS)        .writeTimeout(10, TimeUnit.SECONDS)        .readTimeout(30, TimeUnit.SECONDS)        .build();  }  public void run() throws Exception {    Request request = new Request.Builder()        .url("http://httpbin.org/delay/2") // This URL is served with a 2 second delay.        .build();    Response response = client.newCall(request).execute();    System.out.println("Response completed: " + response);  }

8.对单例的OkHttpClient运行中改变配置:

 client.newBuilder() 后再如改变超时,
  
private final OkHttpClient client = new OkHttpClient();  public void run() throws Exception {    Request request = new Request.Builder()        .url("http://httpbin.org/delay/1") // This URL is served with a 1 second delay.        .build();    try {      // Copy to customize OkHttp for this request.      OkHttpClient copy = client.newBuilder()          .readTimeout(500, TimeUnit.MILLISECONDS)          .build();      Response response = copy.newCall(request).execute();      System.out.println("Response 1 succeeded: " + response);    } catch (IOException e) {      System.out.println("Response 1 failed: " + e);    }    try {      // Copy to customize OkHttp for this request.      OkHttpClient copy = client.newBuilder()           .readTimeout(3000, TimeUnit.MILLISECONDS)          .build();      Response response = copy.newCall(request).execute();      System.out.println("Response 2 succeeded: " + response);    } catch (IOException e) {      System.out.println("Response 2 failed: " + e);    }  }

9.Https:

OkHttp内置了3种连接方式:
MODERN_TLS,COMPATIBLE_TLS ,CLEARTEXT 
自签证书:
private final OkHttpClient client;  public CustomTrust() {    SSLContext sslContext = sslContextForTrustedCertificates(trustedCertificatesInputStream());    client = new OkHttpClient.Builder()        .sslSocketFactory(sslContext.getSocketFactory())        .build();  }  public void run() throws Exception {    Request request = new Request.Builder()        .url("https://publicobject.com/helloworld.txt")        .build();    Response response = client.newCall(request).execute();    System.out.println(response.body().string());  }  private InputStream trustedCertificatesInputStream() {    ... // Full source omitted. See sample.  }  public SSLContext sslContextForTrustedCertificates(InputStream in) {    ... // Full source omitted. See sample.  }

10.详细可以参考:

okHttp的源码例子或者wiki或者民间大神的github:

okHttp官方github地址

other对okHttp的封装

0 0
原创粉丝点击