Retrofit学习笔记


那么正题开始,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 retrofitGet = new Retrofit.Builder()
                        .baseUrl("http://apis.baidu.com/txapi/mvtp/")
                        //增加返回值为String的支持
                        .addConverterFactory(ScalarsConverterFactory.create())
                        //增加返回值为Gson的支持(以实体类返回)
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();
这一段代码是Retrofit的初始化,baseUrl后跟的是你请求地址的根地址,addConerterFactory这部分是添加解析返回responds的方式,你也可以添加xml的解析方式,当然这样的话你需要另引包。
 
//get请求初始化
RetrofitModel getSerives = retrofitGet.create(RetrofitModel.class);//这里采用的是Java的动态代理模式
Call<MeiNvBean> callGet = getSerives.getQuery("10");//传入我们请求的键值对的值
</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);


}
这里我用的是getquery的方法 在model中对应第一个,可以看到在@header中我们将发送请求的头加入其中,然后声明这是get方式,在@get括号中的path将被加入到baseUrl中所以此时的我们发送的url地址为:http://apis.baidu.com/txapi/mvtp/meinv,然后我们在getQuery的方法里吧num赋值为10,而@query里的值为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还有缓存这部分。。。离职两天啦,还没过面试通知。。生活好艰难






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值