博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OkHttp 新手上路
阅读量:4285 次
发布时间:2019-05-27

本文共 5003 字,大约阅读时间需要 16 分钟。

1.概念

OKHttp 是一款高效的HTTP客户端,支持连接同一地址的链接共享同一个socket,通过连接池来减小响应延迟,还有透明的GZIP压缩,请求缓存等优势,其核心主要有路由、连接协议、拦截器、代理、安全性认证、连接池以及网络适配,拦截器主要是指添加,移除或者转换请求或者回应的头部信息

这个库也是square开源的一个网络请求库(okhttp内部依赖okio)。而且Google在(Android 4.4)版本里面删除了HttpClient相关API,现在是主流框架,很有必要研究

OkHttp 处理了很多网络疑难杂症:会从很多常用的连接问题中自动恢复。如果你的服务器配置了多个IP地址,当第一个IP连接失败的时候,OkHttp会自动尝试下一个IP。OkHttp还处理了代理服务器问题和SSL握手失败问题

这篇我将主要对 OKHttp 研究一下,下一篇再研究对它的封装

  • 一般的get请求
  • 一般的post请求
  • 基于Http的文件上传
  • 文件下载
  • 加载图片
  • 支持请求回调,直接返回对象、对象集合
  • 支持session的保持

2. Http Get

OkHttpClient client = new OkHttpClient();    private String get(String url) throws IOException {        Request request = new Request.Builder()                .url(url)                .build();        Response response = client.newCall(request).execute();         if (response.isSuccessful()) {                    return response.body().string();        } else {                    throw new IOException("Unexpected code " + response);        }    }

Request是OkHttp中访问的请求,Builder是辅助类。Response即OkHttp中的响应

2.1 Response类:

public boolean isSuccessful()Returns true if the code is in [200..300),which means the request was successfully received, understood, and accepted

2.2 response.body()返回ResponseBody类

可以方便的获取string

public final String string() throws IOExceptionReturns the response as a string decoded with the charset of the Content-Type header. If that header is either absent or lacks a charset, this will attempt to decode the response body as UTF-8.Throws:IOException

当然也能获取到流的形式

public final InputStream byteStream()

3. Http Post

3.1 Post 提交 Json 数据

public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");    OkHttpClient client = new OkHttpClient();    String post(String url, String json) throws IOException {        RequestBody body = RequestBody.create(JSON, json);        Request request = new Request.Builder()                .url(url)                .post(body)                .build();        Response response = client.newCall(request).execute();        if (response.isSuccessful()) {            return response.body().string();        } else {            throw new IOException("Unexpected code " + response);        }    }

使用Request的post方法来提交请求体RequestBody

3.2 POST提交键值对

很多时候我们会需要通过POST方式把键值对数据传送到服务器。 OkHttp提供了很方便的方式来做这件事情

OkHttpClient client = new OkHttpClient();String post(String url, String json) throws IOException {     RequestBody formBody = FormBody.Builder()    .add("platform", "android")    .add("name", "bug")    .add("subject", "XXXXXXXXXXXXXXX")    .build();      Request request = new Request.Builder()      .url(url)      .post(body)      .build();      Response response = client.newCall(request).execute();    if (response.isSuccessful()) {        return response.body().string();    } else {        throw new IOException("Unexpected code " + response);    }}

4. 新手须知

网络请求在子线程中进行

response = client.newCall(request).execute();

5. Synchronous Get(同步Get)

下载一个文件,打印他的响应头,以string形式打印响应体。

响应体的 string() 方法对于小文档来说十分方便、高效。但是如果响应体太大(超过1MB),应避免适应 string()方法 ,因为他会将把整个文档加载到内存中。对于超过1MB的响应body,应使用流的方式来处理body

private String get(String url) throws IOException {        Request request = new Request.Builder()                .url(url)                .build();        Response response = client.newCall(request).execute();        Headers responseHeaders = response.headers();        for (int i = 0; i < responseHeaders.size(); i++) {            Log.e(TAG, "get: "+responseHeaders.name(i) + ": " + responseHeaders.value(i));        }        return response.body().string();    }

6. Accessing Headers(提取响应头)

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

7. Posting a String(Post方式提交String)

使用HTTP POST提交请求到服务。这个例子提交了一个markdown文档到web服务,以HTML方式渲染markdown。因为整个请求体都在内存中,因此避免使用此api提交大文档(大于1MB)

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

脖子疼,先不写了

转载地址:http://copgi.baihongyu.com/

你可能感兴趣的文章
java/System/BigInteger/BigDecimal/Date/Calender
查看>>
java/对象数组/集合
查看>>
java/数据结构/栈/队列/数组/链表/ArrayList/泛型/增强for/静态导入/可变参数
查看>>
java基础/集合框架/set/hasset/linkHasset/TreeSet/
查看>>
java基础/map/hasmap/linkedhasmap/treemap/collections工具类
查看>>
java集合的总结
查看>>
java. tr'y--catch/IO流/file/
查看>>
C语言socket编程总结(一)getaddrinfo()函数详解
查看>>
C语言socket编程总结(二) inet_pton,/inet_ntop
查看>>
C语言socket编程总结(三) struct sockaddr_in /struct sockaddr_in6/struct addrinfo 结构体
查看>>
C语言socket总结(四)htonl/ntohl/ntohs/ntohs/
查看>>
C 语言socket编程基础/memset()
查看>>
C语言socket总结(五) memset()和bzero()
查看>>
C语言socket编程总结(六) / int socket(int domain, int type, int protocol)
查看>>
C语言socket编程总结(七)int socket/connect()/send()/recv()/close()/shutdown()/recvfrom
查看>>
C语言socket编程总结(八)bind()
查看>>
C语言socket编程(九)listen()
查看>>
C语言socket编程(十)a'c'cept()
查看>>
C语言socket编程(十一)CFNetworking框架/CFSocket////CFStream属于CoreFoundation
查看>>
java 基础IO/inputStream/outputStream/buffInputStrem/buffOutputStrem
查看>>