我也不打算讲POST,GET这些表单提交啊的做法。这把讲几个比较重要的东西。
一.Retrofit
使用Retrofit第一个套路就是创建它的实例,不管用什么都要创建实例吧。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://localhost:4567/")
.build();
从最简单的用法可以看出它用了build模式,可以说这设计非常的用心。我们来看看Builder这个内部类中的的方法(不知道build模式的最好先学一下,不难的)。这里教大家一个方法浏览这个类中有什么方法。只需要在AS的最左边点开Structure
就讲一些比较常用到的(不,是只讲我懂的,我不懂的也没法扯)。
1.baseUrl
这个就不用说了吧,两个baseUrl是内部相互调用的,源码单独抽出来不好讲,知道它的功能是设置基本的路径就行。
2.addConverterFactory
这是添加ConverterFactory,是用于转换响应体,过后会详细讲。
3.addCallAdapterFactory
这是添加CallAdapter,关于CallAdapter其实我也没去看,因为我用RxJava的,我觉得RxJava已经是很好用了,没必要再自己去定义CallAdapter(是我这种渣渣没必要,大神一般都喜欢用自己自定义的东西)
4.callbackExecutor
也是处理返回值,不过是用在同步的时候,我们平时一般都是用异步。
5.client
这是用于配置内部的OkHttp,平时也很常用到。
最后常用配置后:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(okHttpClient) //okHttpClient过后会说常用的创建
.addConverterFactory(FastJsonConvertFactory.create())// 可以用Gson
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
二.两个Factory
平时用到的addConverterFactory就是Gson,有时候可能需要用到xml,平时用到的addCallAdapterFactory就是Rxjava,或者可以不使用,我一直都是用RxJava,因为好用。
addConverterFactory有时候需要自定义,所以我上一篇说了这个要学会怎么去自定义。
三.RequestBody
毫无疑问请求体是个很重要的东西, 我以前用过volley好像记得要自己弄请求体,而Retrofit在普通的post和get请求时并不需求拿到实例化的请求体对象,内部会帮你做好了,但是有时也需要对RequestBody进行一些操作。
那么最常直接用到RequestBody的地方是哪里呢,就是文件的上传。
文件上传的整个过程我肯定是到后面才会讲的,所以这个地方讲的时候可能会有些看不懂,没关系,大不了看完后面再看前面。
先来一发RequestBody的结构
1.contentLength()
这个是返回将要写入的字节数,默认是-1,表示不确定要写入多少,这个不常用到的,但是有些特殊需求可能会用到。
2.contentType()
返回Content-Type,就是
上传文件使用使用multipart是这样的一个格式,分割线里面的是一个文件,最好要把分割线内的格式背下,最好要把分割线内的格式背下,最好要把分割线内的格式背下,重要的事说三遍,这个格式是固定的,是相互约定形成的,你会看到里面有个Content-Type的字段。
contentType()方法就是返回这个,如果是这里的请求,返回的就是image/jpeg。
记住,这个方法返回的是MediaType类型,你只需要先知道MediaType这个类可以把它当成是描述Content-Type的字段。
3.writeTo
这个方法的注解是“将此请求的内容写入sink”,我也读不懂是什么意思。可以看看BufferedSink
说的大概就是一个缓冲区,也不是很了解,之后用到再具体学吧。
4.create
这个方法有重载,你会发现第一个参数是Content-Type的字段,第二个参数常用的一般用byte[]和File。
实际使用
你会发现,一般传图片时都会这样写,例如:
RequestBody photoRequestBody = RequestBody.create(MediaType.parse("image/png"), file);
这一个参数就是Content-Type,第二个参数他这里传file,当然传byte或者其它也行。
四.ResponseBody
方法比RequestBody多,但是很多方法的作用都能从图中看懂,比如说byteStream就是获取InputStream。方法太多了也不好一个一个讲,之后将下载文件时会有个需求是监听下载进度,到时候再详细讲这个ResponseBody常用的方法。
五.OkHttpClient
在前面的创建Retrofit对象时,有一个client()方法,里面传的对象就是OkHttpClient类,也就是说如果我们需要配置一些请求时的配置(请求头、请求时间什么之类的),我们就需要在创建Retrofit时调用client()方法,所以我们就需要创建一个OkHttpClient对象。
OkHttpClient类也是封装得很好,也是使用Builder模式,所以使用起来非常方便,我们来看看创建时可以调用哪些方法。
1.connectTimeout、readTimeout、writeTimeout
这很简单,设置连接时、写入时、读取时的超时时间。
2.cookieJar
这个是设置cookie
3.setInternalCache、cache
设置缓存,要自己创建InternalCache对象或者Cache对象,一般都是调用cache的吧。
4.interceptors和networkInterceptors
这个是返回一个拦截器数组,拦截器,什么是拦截器,我怎么感觉我好像要全部讲完OkHttp的过程,总之先了解这个是返回一个拦截器数组。
5.addInterceptor和addNetworkInterceptor
设置单个拦截器到拦截器数组中
比如我们一般,不是一般,可以说是必须,设置日记拦截器,这样就能在Logcat中打印请求和响应的过程。
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(logging);
这只是举个例子,还可以设置很多拦截器,包括自定义的拦截器。如果有时间会单独写一篇关于okhttp的,所以这里不多讲。
5.proxy
设置由该客户端创建的连接将使用的HTTP代理。
6.sslSocketFactory
设置用于保护HTTPS连接的套接字工厂和信任管理器。这个是和证书有关的,我http懂得也不是很多,不知道要怎么解释,反正就是如果是用Https的话要写这个方法,百度上也有教要怎么写。
好了,这样就能创建传出一个Retrofit对象,并对一些常用到的对象和方法有了一定的了解,要想深入去使用,讲真还是要去看源码,源码这么多,我不是大神,我不可能全部讲完,而且也没那个时间,我只能随便东扯扯西扯扯,所以要弄懂一个东西,还是要靠自己