那么正题开始,Retrofit是okHttp的作者square 对okhttp的再次封装,可能以往习惯用okhttp或者httpclient初用起来会有些不适应,但是如果你熟悉restful的话,上手会很快的;首先当然是要添加依赖。
compile 'com.squareup.retrofit2:retrofit:2.1.0'//Retrofit2所需要的包
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'//ConverterFactory的Gson依赖包
compile 'com.squareup.retrofit2:converter-scalars:2.0.0-beta4'//ConverterFactory的String依赖包
我们也可以在 点击打开链接查看retrofit的api
图片是我测试get方法所用的api 百度api市场美女图片那么上代码吧:
1.使用@query的get方法
这一段代码是Retrofit的初始化,baseUrl后跟的是你请求地址的根地址,addConerterFactory这部分是添加解析返回responds的方式,你也可以添加xml的解析方式,当然这样的话你需要另引包。Retrofit retrofitGet = new Retrofit.Builder() .baseUrl("http://apis.baidu.com/txapi/mvtp/") //增加返回值为String的支持 .addConverterFactory(ScalarsConverterFactory.create()) //增加返回值为Gson的支持(以实体类返回) .addConverterFactory(GsonConverterFactory.create()) .build();
//get请求初始化 RetrofitModel getSerives = retrofitGet.create(RetrofitModel.class);//这里采用的是Java的动态代理模式 Call<MeiNvBean> callGet = getSerives.getQuery("10");//传入我们请求的键值对的值
这里我用的是getquery的方法 在model中对应第一个,可以看到在@header中我们将发送请求的头加入其中,然后声明这是get方式,在@get括号中的path将被加入到baseUrl中所以此时的我们发送的url地址为:http://apis.baidu.com/txapi/mvtp/meinv,然后我们在getQuery的方法里吧num赋值为10,而@query里的值为num;</pre><span style="white-space:pre"></span>可以看到我们上面的代码中新定义了一个RetrofitModel的接口,事实上在retrofit使用过程中我们都要定义一个这样的接口。<p></p><p><span style="white-space:pre"></span>那么来看看这个接口是怎么写的</p><p></p><pre name="code" class="java">>public interface RetrofitModel { @Headers("apikey: 10454b35096a10a8e063565196a09561") @GET("meinv") Call<MeiNvBean> getQuery(@Query("num") String num); @Headers("apikey: 10454b35096a10a8e063565196a09561") @GET("{test}") Call<MeiNvBean> getPath(@Path("test") String test, @Query("num") String num); @Headers("apikey: 10454b35096a10a8e063565196a09561") @POST("spam_comment_filtering") Call<AdStatusBean> createBody(@Body PostBody postBody); @Headers("apikey: 10454b35096a10a8e063565196a09561") @POST("spam_comment_filtering") @FormUrlEncoded Call<AdStatusBean> createFrom(@Field("text") String text); @Headers("apikey: 10454b35096a10a8e063565196a09561") @GET("meinv") Call<MeiNvBean> getCommon(@Query("num") String num); }
所以我们发送最终的url为http://apis.baidu.com/txapi/mvtp/meinv?num=10
然后我们用Call.enqueue或者exctue进行异步或者同步的请求
2.使用@path的get方法
还是调用1里的接口所以retrofit构建部分就省略了
callGet = getSerives.getPath("meinv", "10");//传入我们请求的键值对的值
可以看到这里我们调用了接口中第二个方法getPath,我们把baseUrl所需添加的Url使用@path的方式映射到{}中替换了{“test”}然后就如以往一样加上@query
3.post请求
其实post请求里还有很大一部分是文件上传部分的,需要base64加密,所以本次博客就先不写这部分了
普通的post请求我们的样例接口是这个
Retrofit retrofitPost = new Retrofit.Builder()
.baseUrl("http://apis.baidu.com/datagrand/spam_comment_filtering/")
//增加返回值为String的支持
.addConverterFactory(ScalarsConverterFactory.create())
//增加返回值为Gson的支持(以实体类返回)
.addConverterFactory(GsonConverterFactory.create())
.build();
//post请求初始化
RetrofitModel postSerives = retrofitPost.create(RetrofitModel.class);
PostBody postBody = new PostBody("3m每天百分之1利息,60元起步,有需要可以联系我,Q49663537,或者关注百度贴吧,老马平台吧!");
这次我们调用了createFrom的方法,他是这样的
@Headers("apikey: 10454b35096a10a8e063565196a09561")
@POST("spam_comment_filtering")
@FormUrlEncoded
Call<AdStatusBean> createFrom(@Field("text") String text);
这种方式的话@FromUrlEncoded是必须要加的,然后就没什么可说的了
4.可以看到我们每次都要在headers里加上apikey 这确实时间非常蠢的事情,所以有没有办法可以添加一个共同的header呢?自然是有的:我们在构建Retrofit时这样构建就可以了
Retrofit retrofitCommon = new Retrofit.Builder()
.baseUrl("http://apis.baidu.com/txapi/mvtp/")
//增加返回值为Gson的支持(以实体类返回)
.addConverterFactory(GsonConverterFactory.create())
.client(new OkHttpClient.Builder().addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request original = chain.request();
// Request customization: add request headers
Request.Builder requestBuilder = original.newBuilder()
.addHeader("apikey", "10454b35096a10a8e063565196a09561");
Request request = requestBuilder.build();
return chain.proceed(request);
}
}).build())
.build();
也可以通过
Retrofit retrofitCommon = new Retrofit.Builder()
.baseUrl("http://apis.baidu.com/txapi/mvtp/")
//增加返回值为Gson的支持(以实体类返回)
.addConverterFactory(GsonConverterFactory.create())
.client(new OkHttpClient.Builder().addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request original = chain.request();
HttpUrl originalHttpUrl = original.url();
HttpUrl url = originalHttpUrl.newBuilder()
.addQueryParameter("apikey", "your-actual-api-key")
.build();
// Request customization: add request headers
Request.Builder requestBuilder = original.newBuilder()
.url(url);
Request request = requestBuilder.build();
return chain.proceed(request);
}
}).build())
.build();
这种方式添加同一个paramater
好了到这我的Retrofit学习笔记已经完成了稍后我会把我的代码传到我的github上点击打开链接,然后下一步大概就是利用那个美女图片的api做一个展示页吧,然后看看练一练imageLoader还有缓存这部分。。。离职两天啦,还没过面试通知。。生活好艰难