OkHttp3简单使⽤和封装使⽤
OkHttp简介
OkHttp是⼀个http协议⽹络请求的框架,OkHttp是⼀个⾼效的HTTP客户端,适⽤于Android和Java应⽤程序。从Android 4.4开始google已经开始将源码中的HttpURLConnection替换为OkHttp,⽽在Android 6.0之后的SDK中google更是移除了对于HttpClient的⽀持,⽽现在流⾏的Retrofit同样是使⽤OkHttp进⾏再次封装⽽来的。
本⽂章主要讲的:
1.Okhttp3简单使⽤
2.Okhttp3封装使⽤
效果图
效果图.gif
拿到代码后移到⾃⼰项⽬中根据⾃⼰项⽬需求修改即可使⽤。
OkHttp3特性
⽀持http2,使得对同⼀个主机发出的所有请求都可以共享相同的socket套接字连接;
使⽤连接池来复⽤连接以减少延迟、提⾼效率;
⽀持Gzip压缩响应体,降低传输内容的⼤⼩;
⽀持Http缓存,避免重复请求;
请求失败时会⾃动重试主机中的其他IP地址⾃动重定向;
使⽤Okio来简化数据的访问与存储,提⾼性能;
使⽤了创建者设计模式;
Http简介
HTTP是⼀个属于应⽤层的⾯向对象的协议,由于其简捷、快速的⽅式,适⽤于分布式超媒体信息系统。它于1990年提出,经过⼏年的使⽤与发展,得到不断地完善和扩展。⽬前在WWW中使⽤的是HTTP/1.1版本。2.0版本⽬前也有在使⽤,只是使⽤不⼴泛。HTTP协议⼯作于客户端-服务端架构为上,我们把Http协议中通信的两⽅称作Client和Server,Client端向Server端通过http协议发送⼀个Request请求,Server端收到Client端发来的Request请求后经过⼀系列的处理返回Client⼀个Response,过程如下图。
Client客户端 - Server服务端
HTTP请求报⽂格式
HTTP请求报⽂主要由请求⾏、请求头部、请求正⽂3部分组成。
请求⾏:由请求⽅法,URL,协议版本三部分构成。
URL是请求服务器地址。
协议版本有HTTP1.0、HTTP1.1,⽬前HTTP2.0也有使⽤。
HTTP1.0定义了三种请求⽅法: GET, POST 和 HEAD⽅法。
HTTP1.1新增了五种请求⽅法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT ⽅法。
请求⽅法
请求头部为请求报⽂添加了⼀些附加信息,由“名/值”对组成,每⾏⼀对,名和值之间使⽤冒号分隔。
Host ----接受请求的服务器地址,可以是IP:端⼝号,也可以是域名
User-Agent ----发送请求的应⽤程序名称
Connection ---- 指定与连接相关的属性,如Connection:Keep-Alive
Accept-Charset ---- 通知服务端可以发送的编码格式
Accept-Encoding ---- 通知服务端可以发送的数据压缩格式
Accept-Language ---- 通知服务端可以发送的语⾔
请求正⽂,可选部分,GET请求就没有请求正⽂。
HTTP响应报⽂格式
HTTP响应报⽂主要由状态码、响应头部、响应正⽂3部分组成。
常⽤状态码
200:响应成功
302:重定向跳转,跳转地址通过响应头中的Location属性指定
400:客户端请求有语法错误,参数错误,不能被服务器识别
403:服务器接收到请求,但是拒绝提供服务(认证失败)
404:请求资源不存在
500:服务器内部错误
响应头部,与请求头部类似,为响应报⽂添加了⼀些附加信息
Server - 服务器应⽤程序软件的名称和版本
Content-Type - 响应正⽂的类型(是图⽚还是⼆进制字符串)
Content-Length - 响应正⽂长度
Content-Charset - 响应正⽂使⽤的编码
Content-Encoding - 响应正⽂使⽤的数据压缩格式
Content-Language - 响应正⽂使⽤的语⾔
响应正⽂,是请求响应的最终结果,都在响应体⾥。可以是字符串可以是字符流。
配置
maven⽅式:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.12.0</version>
</dependency>
gradle⽅式:
compile 'com.squareup.okhttp3:okhttp:3.12.0'
Android3.0 以后已经不允许在主线程访问⽹络。需要注意的是这个onResponse回调⽅法不是在主线程回调,可以使⽤runOnUIThread(new Runnable(){})更新UI,或者使⽤Handler在主线程中更新UI。
GET请求
1.第⼀步创建OkHttpClient对象
2.如果需要拼接参数 (⼀般有参数的都会⽤Post请求,除⾮参数不重要)
3.第⼆步创建request对象
4.新建⼀个Call对象
5.同步请求⽹络execute()
6.异步请求⽹络enqueue(Callback)
⾃动下载okio资源
Libraries资源
联⽹权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
1.简单使⽤
HTTP⼯作中常⽤⽅式:
get请求
post请求
⽂件上传
⽂件下载
图⽂混合上传
Android3.0 以后已经不允许在主线程访问⽹络。需要注意的是这个onResponse回调⽅法不是在主线程回调,可以使⽤runOnUIThread(new Runnable(){})更新UI,或者使⽤Handler在主线程中更新UI。
GET请求
1.第⼀步创建OkHttpClient对象
2.如果需要拼接参数 (⼀般有参数的都会⽤Post请求,除⾮参数不重要)
3.第⼆步创建request对象
4.新建⼀个Call对象
5.同步请求⽹络execute()
6.异步请求⽹络enqueue(Callback)
/**
* 获取轮播图接⼝
* GET请求
*/
private void requestBannerApi(){
//1.第⼀步创建OkHttpClient对象
final OkHttpClient okHttpClient = new OkHttpClient();
String url ="www.wanandroid/banner/json";
/
/2. 如果需要拼接参数(⼀般有参数的都会⽤Post请求,除⾮参数不重要)
//        Map<String, String> params = new HashMap<>();
android retrofit
//        params.put("movieid", "246363");
//        params.put("limit", "3");
//        params.put("offset", "5");
//        url = appendParams(url,params);
//3.第⼆步创建request
Request.Builder builder = new Request.Builder();
final Request request = builder.url(url)
.get()
.build();
/
/4.新建⼀个Call对象
final Call call = wCall(request);
//5.同步请求⽹络execute()
new Thread(new Runnable() {
@Override
public void run() {
try {
try {
Response response = ute();
if(response.isSuccessful()){
Log.e("Benner请求成功同步=",response.body().string());
}else{
throw new IOException("Unexpected code " + response);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
//6.异步请求⽹络enqueue(Callback)
@Override
public void onFailure(Call call, IOException e) {
Log.e("TAG", "Benner请求失败="+e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String json = response.body().string();
Log.e("TAG", "Benner请求成功异步="+json);
}
});
}
/**
* 拼接参数
* @param url
* @param params
* @return
*/
private String appendParams(String url, Map<String, String> params) {
StringBuilder sb = new StringBuilder();
sb.append(url + "?");
if (params != null && !params.isEmpty()) {
for (String key : params.keySet()) {
sb.append(key).append("=").(key)).append("&");
}
}
sb = sb.deleteCharAt(sb.length() - 1);
String();
}
注意execute()同步⽅式会阻塞调⽤线程,所以在Android中应放在⼦线程中执⾏,否则有可能引起ANR异常。⼀般都会使⽤enqueue()异步请求服务器。
POST请求(键值对 key-value)
1.拿到okhttpClient对象
2.创建 FormBody 添加需要的键值对
3.构造Request
4.创建⼀个Call对象
5.异步请求enqueue(Callback)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。