1.导包,manifest加网络权限
build.grade
compile 'com.squareup.okhttp3:okhttp:3.8.0'
compile 'com.squareup.okio:okio:1.12.0'
manifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
2.创建OkHttpClient实例
OkHttpClient client = new OkHttpClient();
OkHttpClient clientWith30sTimeout = client.Builder()
.readTimeout(30, TimeUnit.SECONDS)
.build();
OkHttpClient client = client.newBuilder().build();
遇到的问题:
onResponse回调有一个参数是response
如果想获得返回的是字符串,可以通过response.body().string()
如果获得返回的二进制字节数组,则调用response.body().bytes()
如果想拿到返回的inputStream,则调response.body().byteStream()
Get请求 ,同步excute异步enqueue
//通过url设置请求,get方式,默认是get,
Request req = new Request.Builder().url(url).get().build();
//通过请求得到响应,得到call对象,使用execute时同步请求,用得少
Response resp = client.newCall(req).execute();
if (resp.isSuccessful()) {
return resp.body().string();
} else {
throw new IOException("code : " + resp);
}
//异步enqueue,用的多
client.newCall(req).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(Response response) throws IOException {
}
});
异步Get请求——下载文件
注意事项:
先搞定父文件夹,在新建子文件,写入数据,注意方法
boolean mkdir() 创建此抽象路径名指定的目录。
boolean mkdirs() 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
getExternalCacheDir()–外部缓存,/storage/sdcard/Android/data/<应用包名>/cache目录
getCacheDir()–应用程序内的内部缓存,用来存储临时数据,自动清除,/data/data/<应用包名>/cache目录
Environment.getExternalStorageDirectory()—///mnt/sdcard
键值对
通过FormBody
添加多个String键值对
最后为Request添加post方法并传入formBody
// 创建文件类型
MediaType MEDIATYPE = MediaType.parse("application/json;charset=utf-8");
//获得请求体
RequestBody reqBody = RequestBody.create(MEDIATYPE, "被提交");
//step3:创建请求
Request req = new Request.Builder().url(urlStr).post(reqBody).build();
//execute,同步请求,enqueue(new Callback()异步请求
Response resp = client.newCall(req).execute();
异步POST——上传文件
先添加权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
//2.1 获取文件
File file = new File(Environment.getExternalStorageDirectory() + "test.txt");
RequestBody reqBody = RequestBody.create(MEDIATYPE, file);
异步上传Multipart文件
Post方式提交流
HTTP头部的设置和读取
HTTP 头的数据结构是 Map
header(name,value)
来设置HTTP头的唯一值,如果请求中已经存在响应的信息那么直接替换掉。addHeader(name,value)
来补充新值,如果请求头中已经存在name的name-value,那么还会继续添加,请求头中便会存在多个name相同而value不同的“键值对”。意义:复用连接,减少了频繁的网络请求导致性能下降的问题
Http是基于TCP协议的,而TCP建立连接需要经过三次握手,断开需要经过四次挥手,
因此,Http中添加了一种KeepAlive机制,当数据传输完毕后仍然保持连接,等待下一次请求时直接复用该连接。
一次响应的流程
如果使用keep-alive:优点 减少握手的次数,大幅提高效率。
缺点:并非keep-alive的timeout设置时间越长,就越能提升性能。长久不关闭会造成过多的僵尸连接和泄露连接出现。
主机对主机,三次握手,6种提示
位码即tcp标志位,有6种标示:
SYN(synchronous建立联机)
ACK(acknowledgement 确认)
PSH(push传送)
FIN(finish结束)
RST(reset重置)
URG(urgent紧急)
Sequence number(顺序号码 seq)
Acknowledge number(确认号码 ack)
DOM:整个文件读入,构建树结构,便于操作,占内存
SAX:事件驱动解析,以文档开始结束,元素开始结束作为标志,响应事件。不用事前调用文档,占内存小,不持久,可能会丢失数据
PULL:Android上面的类似于SAX的解析方式,区别是有返回值,PULL可以停止解析
Gson:Google 的jar包,直接由字符串解析为java对象,简单方便
JSONObject:
FastJson:阿里巴巴开源解析Json的库
SSL 是为网络通信提供安全及数据完整性的一种安全协议。将 SSL 证书安装在网站服务器上,可实现网站身份验证和数据加密传输双重功能。
机密性:保证不被截取窃听
可靠性:C/S都会认证,但是C端是可选的
完整性:对数据进行完整性检查