Retrofit网络请求库应用01

PS:什么是Retrofit?

  在官方文档中有这样一句话--A type-safe HTTP client for Android and Java(一个类型安全的http client库),具体的话就去问百度吧。Retrofit是网络请求库,是一个开源的。主要是写代码会更少,更快,条例更清晰,刚开始学肯定是觉得还是自己写httpconnect好,自己写,想怎么写就怎么写,每个东西都有一个过程,现在主流的网络开源库还有volley,okhttp等,这都不错,今天我就写一篇简单的retrofit使用访问百度,返回百度页面的源码,这仅仅是为了证明该库怎么使用而已,我们先说标红内容,下一篇就是如何快速解析JSON和XML。开始。

主要内容:

  • Retrofit加载
  • 如何使用
  • GET和POST
  • JSON和XML解析

1:首先我们要加载Retrofit包

  我的studio是2.0,我在官方文档上看到现在是Retrofit2.3.0,编辑器要求是studio2.3、java7及以上,我在添加依赖的时候找不到该包,所以我只能手动

compile 'com.squareup.retrofit2:retrofit:2.0.1'

 2:创建接口Service,当然这个名字可以随便起。

先使用GET,/为根目录,在MainActivity中写http://www.baidu.com,总的网址就是http://www.baidu.com/,在后面加了一个/.

public interface Service {
    @GET("/")
    Call<String> getBaidu();
}

 3:MainActivity中添加Retrofit对象

 Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://www.baidu.com")
                .addConverterFactory(new Converter.Factory() {
                    @Override
                    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
                        return new Converter<ResponseBody, String>() {
                            @Override
                            public String convert(ResponseBody value) throws IOException {
                                return value.string();
                            }
                        };
                    }
                })
                .build();

 这里需要注意的是:我们在调用百度网址的时候,加载到的数据并不是String,准确来说是二进制流或者说是网络请求回调(请求包,头数据等)。我们需要把它转换成String,Converter<ResponseBody, ?>转换成?(因为不一定是什么类型)。

.addConverterFactory(new Converter.Factory() {
                    @Override
                    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
                        return new Converter<ResponseBody, String>() {
                            @Override
                            public String convert(ResponseBody value) throws IOException {
                                return value.string();//写String即可
                            }
                        };
                    }
                })

 然后拿到Service实例

Service service = retrofit.create(Service.class);
        Call<String> baidu = service.getBaidu();
        baidu.enqueue(this);

 重写两个方法:

 @Override
    public void onResponse(Call<String> call, Response<String> response) {
        Log.e("fanhuizhi",response.body()+"。。。");
    }

    @Override
    public void onFailure(Call<String> call, Throwable throwable) {
        throwable.printStackTrace();
        Log.e("fanhuizhi","出错了");
    }

 4:添加网络权限

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

 运行结果:

posted on 2017-12-11 09:40  TMusketeer  阅读(369)  评论(0编辑  收藏  举报