网络通信 | 青训营笔记

120 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第6天

网络请求

  • 客户端向服务端发起请求,服务端返回数据给到客户端

  • 由于网络请求在大型App里使用非常频繁,为了更好的支持业务迭代,一般会进行网络请求的封装

网络请求框架

image.png

HttpURLConnection

http网络请求:分为GET请求和POST请求,客户端发送请求到服务器,然后服务器将结果返回给客户端。
GET表示从服务器那里获取数据,而POST则表示提交数据给服务器。

通过Http访问网络的三个步骤:
1、发送http请求
2、接受服务响应
3、解析返回数据

HttpURLConnection类位于java.net包中,它用于发送HTTP请求和获取HTTP响应,提供了基于HTTP的网络访问方法。

使用HttpURLConnection访问HTTP资源的主要操作步骤:
1.利用URL地址实例化URL类
2.由URL类创建HttpURLConnection对象
3.以GET/POST方式向服务器发送请求
4.接收服务器响应
5.关闭连接

具体使用步骤请见(blog.csdn.net/m0_66309026…)

Volley

volley是2014年google在I/O大会上推出的、解决android设备中频繁但数据量不大的网络访问问题的一个异步网络请求框架和图片加载框架

Volley包含的请求类型:

StringRequest             #返回字符串数据
JsonObjectRequest         #返回JSONArray数据
JsonArrayRequest          #返回JSONObject数据
ImageRequest              #返回Bitmap类型数据

   ~~~    ~~~    ~~~    ~~~    ~~~    ~~~    ~~~    ~~~Volley总体设计图 image.png    ~~~    ~~~    ~~~    ~~~    ~~~    ~~~    ~~~    ~~~Volley请求处理流程图 image.png

具体使用方法请见Volley网络框架完全解析(使用篇) | volley (lmlphp.com)

OkHttp

OkHttp是安卓开发中十分常用的网络请求框架,可用来支持一般的get请求、post请求,进行基于Http的文件上传、文件下载、上传下载的进度回调,图片加载,支持请求回调、对象返回和表单请求

请求流程
1、生成一个OkHttpClient(用以总的控制)
2、用各种键值对包装我们的Request
3、将请求加入队列生成一个Call管理请求
4、若是同步请求直接执行excute等待处理返回Response,若为异步则实现Callback回调,在onResponse里获取Response参数

image.png 基本使用方法请见Okhttp3基本使用 - 简书 (jianshu.com)

Retrofit

Retrofit是对OkHttp的一个封装,也是当前最为流行的一种网络请求组合方式 使用方法
1、Retrofit库的引入(依赖库)
在app下的build.gradle文件里添加:

dependencies {
	implementation 'com.squareup.retrofit2:retrofit:2.9.0'  //Retrofit的依赖项
	implementation 'com.squareup.retrofit2:converter-gson:2.9.0'  //Retrofit-gson的依赖项
	......
}

2、创建用于描述网络请求的接口

//接口类名:可自定义,尽量和这类请求的含义相关
interface IUserInfoService {

    @GET("users/{uid}/name")
    fun getUserName(@Path("uid") uid: Int): Call<ResponseBody>

    //@GET("users/{name}/uid")
    //fun getRequest(@Path("name" name:String)) Call<User>
    
    //后续可以增加其他的接口,一个接口对应一个api请求
}

//函数名:可自定义,需要能识别出该接口的作用,该interface里可以增加多个不同的函数
//@GET 注解:用于指定该接口的相对路径,并采用Get方法发起请求
//@Path 注解:需要外部调用时,传入一个uid,该uid会替换@GET注解里相对路径的{uid}
//返回值Call<ResponseBody>,这里用ResponseBody,我们可以直接拿到请求的String内容
//如果要自动转为Model类,例如User,这里直接替换为User就好。

3、使用 Retrofit 实例发起网络请求
   ~~~3.1创建Retrofit实例
   ~~~3.2创建iUserInfoService实例
   ~~~3.3创建网络请求Call对象
   ~~~3.4使用Call对象发起异步请求\

fun getUserName(view: View) {
    //创建Retrofit实例
    val retrofit = Retrofit.Builder()
        .baseUrl("https://www.bytedance.com/")
        .build()
    //创建iUserInfoService实例
    val iUserInfoService = retrofit.create(IUserInfoService::class.java)
    //创建网络请求Call对象
    val call = iUserInfoService.getUserName(1123)
    //发起异步请求
    call.enqueue(object : Callback<ResponseBody> {

        override fun onResponse(call: Call<ResponseBody>,
                                response: Response<ResponseBody>) {
            //请求成功时回调
            request_result_tv.text = "请求成功:" + response.body()!!.string()
        }

        override fun onFailure(call: Call<ResponseBody>, e: Throwable) {
            //请求失败时候的回调
            request_result_tv.text = "请求失败:" + e.message
        }
    })
}

TTNet

字节跳动的网络库,是基于Retrofit的进行二次开发,替换Retrofit底层的OkHttp为Cronet,核心主要是替换Retrofit其中的2点:

  • 替换底层用到的OKHttpClient

  • 替换底层用到的OKHttpCall

优点:

  • 基于Retrofit改造,具备Retrofit所具有的优点
  • 支持多个Http网络库的动态切换(okhttp和cronet)
  • 支持网络拦截配置:添加公共参数,动态切换协议及Host,动态选路等
  • 支持流解析,json序列化

总结

image.png