Android -- OKHttp,XML,JSON

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

遇到的问题:

  1. 在子线程操作网络
  2. 高版本要用https
  3. 之前没有添加过网络权限的要重新卸载安装
  4. 安全问题,为保证用户数据和设备的安全,Google 针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,这意味着 Android P 将禁止 App 使用所有未加密的连接,因此运行 Android P 系统的安卓设备无论是接收或者发送流量,未来都不能明码传输,需要使用下一代(Transport Layer Security)传输层安全协议,而 Android Nougat 和 Oreo 则不受影响。
    (1)APP 改用 https 请求
    (2)targetSdkVersion 降到27以下
    (3)更改网络安全配置

onResponse回调有一个参数是response
如果想获得返回的是字符串,可以通过response.body().string()
如果获得返回的二进制字节数组,则调用response.body().bytes()
如果想拿到返回的inputStream,则调response.body().byteStream()

GET:

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

POST:

键值对
通过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类型。也就是说,对于每个 HTTP 头,可能有多个值。但是大部分 HTTP 头都只有一个值,只有少部分 HTTP 头允许多个值。至于name的取值说明,可以查看这个请求头大全。

OkHttp的处理方式是:

  • 使用header(name,value)来设置HTTP头的唯一值,如果请求中已经存在响应的信息那么直接替换掉。
  • 使用addHeader(name,value)来补充新值,如果请求头中已经存在name的name-value,那么还会继续添加,请求头中便会存在多个name相同而value不同的“键值对”。
  • 使用header(name)读取唯一值或多个值的最后一个值
  • 使用headers(name)获取所有值

OkHttp连接池

意义:复用连接,减少了频繁的网络请求导致性能下降的问题
Http是基于TCP协议的,而TCP建立连接需要经过三次握手,断开需要经过四次挥手,
因此,Http中添加了一种KeepAlive机制,当数据传输完毕后仍然保持连接,等待下一次请求时直接复用该连接。

一次响应的流程
在这里插入图片描述
如果使用keep-alive:优点 减少握手的次数,大幅提高效率。
Android -- OKHttp,XML,JSON_第1张图片
缺点:并非keep-alive的timeout设置时间越长,就越能提升性能。长久不关闭会造成过多的僵尸连接和泄露连接出现。

传输控制协议TCP

主机对主机,三次握手,6种提示
位码即tcp标志位,有6种标示:

  • SYN(synchronous建立联机)

  • ACK(acknowledgement 确认)

  • PSH(push传送)

  • FIN(finish结束)

  • RST(reset重置)

  • URG(urgent紧急)

Sequence number(顺序号码 seq)

Acknowledge number(确认号码 ack)

  • establish 建立,创建
  • TCP
    三次握手流程
    client server
    ​ ——> SYN, seq x
    ​ SYN, seq y, ACK x+1 <——-
    ​ ——> ACK y+1
    为什么需要三次连接,两次会有什么问题?
    server无法确认是否可以连接到client,不可靠
    导致server随便遇到一个延迟的SYN消息,就回复ACK认为建立连接,不可靠
    第一次 SYN失败会怎样
    不断重试
    第三次失败(如果一直收不到ACK会怎样)
    如果客户端会再次发送数据,则建立连接
    如果客户端没有数据,则服务器会超时重发SYN
    超时断开,(浪费资源,DDOS/SYN攻击)
    seq序列号是怎么定的,x是什么,y是什么,握手数据包里带有什么信息
    TCP报文内容/信息
    源端口号。 目的端口号
    序号seq
    确认号ack
    标记位/ACK/SYN/FIN
    window
    数据
    四次挥手
    ——> FIN ,seq x
    <—— ACK, x + 1
    <—— FIN, seq y
    ——> ACK, seq y+1
    为什么需要四次全双工TCP,单方可以断开发送,仍可接受另一方发送
    最后一个ACK回复后会有一段等待时间

网络传输协议,xml,json,protobuf

XML

  • 常见于web开发
  • 优点:可读性强,解析方便,
  • 缺点:效率低,消耗资源
  • 解析方式:DOM解析,SAX解析,PULL解析

DOM:整个文件读入,构建树结构,便于操作,占内存
SAX:事件驱动解析,以文档开始结束,元素开始结束作为标志,响应事件。不用事前调用文档,占内存小,不持久,可能会丢失数据
PULL:Android上面的类似于SAX的解析方式,区别是有返回值,PULL可以停止解析

JSON

  • 优点:比xml空间小,更适合移动端对流量的控制
  • 缺点:传输效率不高
  • 解析方式:Gson解析,JSONObject解析,FastJson解析

Gson:Google 的jar包,直接由字符串解析为java对象,简单方便
JSONObject
FastJson:阿里巴巴开源解析Json的库

ProtoBuf

  • Google 开源二进制网络传输协议
  • 传输效率快,比以上快10-20倍,文档型协议
  • 使用不便

网络安全协议SSL

SSL定义

SSL 是为网络通信提供安全及数据完整性的一种安全协议。将 SSL 证书安装在网站服务器上,可实现网站身份验证数据加密传输双重功能。

SSL 协议的特性

机密性:保证不被截取窃听
可靠性:C/S都会认证,但是C端是可选的
完整性:对数据进行完整性检查

认证

  • 单向认证 SSL 协议不需要客户端拥有 CA 证书,(电子商务认证授权机构(CA, Certificate Authority)),Web 应用都是采用单向认证的
  • 双向认证 SSL 协议的通讯过程,这种情况要求服务器和客户端双方都有 CA 证书。

你可能感兴趣的:(Java,Android)