浅谈我为什么选择用Retrofit作为我的网络请求框架

比较AsyncTask、Volley、Retrofit三者的请求时间

使用 单次请求 7个请求 25个请求
AsyncTask 941ms 4539ms 13957ms
Volley 560ms 2202ms 4275ms
Retrofit2.0 312ms 889ms 1059ms

Retrofit2.0 完胜

使用

添加依赖

build.gradle

compile ‘com.squareup.retrofit2:retrofit:2.0.0-beta4’

请求范例

以淘宝的ip库请求为例


声明接口

public interface ApiControl {

    //@Query注解的作用理解为查询条件,这里表示需要查询的字段为ip
    //ResponseBody是Retrofit自带的返回类,
    @GET("http://ip.taobao.com/service/getIpInfo.php")
    Call<ResponseBody> getIpInfo(@Query("ip") String ip);
}

调用接口

//创建Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
        //当我们的@GET()里有url时,这个baseUrl无效。但是这个必须要填,不然会报错,神奇。
        .baseUrl("http://www.taobao.com.cn/")
        .build();

ApiControl apiStores = retrofit.create(ApiControl.class);
Call<ResponseBody> call = apiStores.getIpInfo("220.160.193.209");
//在主线程里,异步调用。
call.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Response<ResponseBody> response) {
        try {
            Log.i("onResponse", "response=" + response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onFailure(Throwable t) {
        Log.i("onFailure", "onFailure=" + t.getMessage());
    }
});

同步调用

try {
    Response<ResponseBody> response = call.execute();
} catch (IOException e) {
    e.printStackTrace();
}

进阶使用1:ConverterFactory转换工厂

可以帮我们将获取到的数据转换为JAVA BEAN

Retrofit支持以下转换

Gson: com.squareup.retrofit2:converter-gson

Jackson: com.squareup.retrofit2:converter-jackson

Moshi: com.squareup.retrofit2:converter-moshi

Protobuf: com.squareup.retrofit2:converter-protobuf

Wire: com.squareup.retrofit2:converter-wire

Simple XML: com.squareup.retrofit2:converter-simplexml

Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars

Retrofit这里以GsonConverterFactory的为例

添加依赖

compile ‘com.squareup.retrofit2:converter-gson:2.0.0-beta4’

定义java bean

/**
 * Created by xemenes on 25/03/16.
 */
public class IpInfo {

    private int code;

    private DataBean data;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public DataBean getData() {
        return data;
    }

    public void setData(DataBean data) {
        this.data = data;
    }

    public static class DataBean {
        private String country;
        private String country_id;
        private String area;
        private String area_id;
        private String region;
        private String region_id;
        private String city;
        private String city_id;
        private String county;
        private String county_id;
        private String isp;
        private String isp_id;
        private String ip;

        public String getCountry() {
            return country;
        }

        public void setCountry(String country) {
            this.country = country;
        }

        public String getCountry_id() {
            return country_id;
        }

        public void setCountry_id(String country_id) {
            this.country_id = country_id;
        }

        public String getArea() {
            return area;
        }

        public void setArea(String area) {
            this.area = area;
        }

        public String getArea_id() {
            return area_id;
        }

        public void setArea_id(String area_id) {
            this.area_id = area_id;
        }

        public String getRegion() {
            return region;
        }

        public void setRegion(String region) {
            this.region = region;
        }

        public String getRegion_id() {
            return region_id;
        }

        public void setRegion_id(String region_id) {
            this.region_id = region_id;
        }

        public String getCity() {
            return city;
        }

        public void setCity(String city) {
            this.city = city;
        }

        public String getCity_id() {
            return city_id;
        }

        public void setCity_id(String city_id) {
            this.city_id = city_id;
        }

        public String getCounty() {
            return county;
        }

        public void setCounty(String county) {
            this.county = county;
        }

        public String getCounty_id() {
            return county_id;
        }

        public void setCounty_id(String county_id) {
            this.county_id = county_id;
        }

        public String getIsp() {
            return isp;
        }

        public void setIsp(String isp) {
            this.isp = isp;
        }

        public String getIsp_id() {
            return isp_id;
        }

        public void setIsp_id(String isp_id) {
            this.isp_id = isp_id;
        }

        public String getIp() {
            return ip;
        }

        public void setIp(String ip) {
            this.ip = ip;
        }
    }
}

接口方法声明

//GSON转换数据
@GET("http://ip.taobao.com/service/getIpInfo.php")
Call<IpInfo> getIpInfo2(@Query("ip") String ip);

调用接口

Call<IpInfo> ipInfoCall = apiStores.getIpInfo2("220.160.193.207");
ipInfoCall.enqueue(new Callback<IpInfo>() {
    @Override
    public void onResponse(Response<IpInfo> response) {
        Log.d("onResponse",response.body().getData().getCity());
    }

    @Override
    public void onFailure(Throwable t) {
        Log.i("onFailure", "onFailure=" + t.getMessage());            }
});

进阶使用2: 常用接口范例声明

//这里url为请求地址

//多参数,用map,注解用@QueryMap
@GET("url")
Call<ResponseBody> getInfo(@QueryMap Map<String,String> params);

//post的请求参数是放在请求体中的,就是body内(详见http请求),这是以json格式传递参数的
@POST("url")
@FormUrlEncoded
Call<ResponseBody> doLogin(@Body User user);

//post表单传递,map,就是我们一般用到的
@POST("url")
@FormUrlEncoded
Call<ResponseBody> doLogin(@FieldMap Map<String,String> params);

//也是post表单传递,是以单个进行传递
@FormUrlEncoded
@POST("url")
Call<ResponseBody> doLogin(@Field("username") String name, @Field("password") String password);

//请求头更改
@FormUrlEncoded
@Headers({"Accept: application/vnd.github.v3.full+json",
        "User-Agent: Retrofit-Sample-App"})
Call<ResponseBody> getUserInfo();

//动态改变请求头
@GET("/user")
Call<User> getUser(@Header("Authorization") 
String authorization);

时间: 2024-11-10 08:08:25

浅谈我为什么选择用Retrofit作为我的网络请求框架的相关文章

基于Retrofit+RxJava的Android分层网络请求框架

目前已经有不少Android客户端在使用Retrofit+RxJava实现网络请求了,相比于xUtils,Volley等网络访问框架,其具有网络访问效率高(基于OkHttp).内存占用少.代码量小以及数据传输安全性高等特点. Retrofit源码更是经典的设计模式教程,笔者已在之前的文章中分享过自己的一些体会,有兴趣的话可点击以下链接了解:<Retrofit源码设计模式解析(上)>.<Retrofit源码设计模式解析(下)> 但在具体业务场景下,比如涉及到多种网络请求(GET/PU

带你一步步剖析Retrofit 源码解析:一款基于 OkHttp 实现的网络请求框架

OkHttp与Retrofit 的区别与联系是怎样的? 参考答案:OkHttp和Retrofit都是目前流行网络开源框架 封装不同:Retrofit封装了具体的请求,线程切换以及数据转换.retrofit通过使用代理,外观,策略模式对okhttp进行了封装OkHttp 是基于Http协议封装的一套请求客户端 职责不同:Retrofit主要负责应用层面的封装,面向开发者,方便使用,比如请求参数,响应数据的处理,错误处理等等.OkHttp主要负责socket部分的优化与封装,比如网络访问,多路复用,

浅谈CSRF(Cross-site request forgery)跨站请求伪造(写的非常好)

一 CSRF是什么 CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用.尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站.与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性 可以这

django 浅谈CSRF(Cross-site request forgery)跨站请求伪造

一 CSRF是什么 二 CSRF攻击原理 三 CSRF攻击防范 回到目录 一 CSRF是什么 CSRF(Cross-site request forgery)跨站请求伪造,也被称为"One Click Attack"或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用.尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站.与XSS攻击相比,CSRF攻击往往不大流行

RxAndroid+RxJava+Gson+retrofit+okhttp初步搭建android网络请求框架

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } span.s1 { font: 12.0px "Helvetica Neue" } 新建工程集成,工具集成 一.集成 RxAndroid+RxJava git官网 https://github.com/ReactiveX/RxAndroid Gson git官网 https://github.co

【腾讯Bugly干货】深入浅出 Retrofit,这么牛逼的框架你们还不来看看?

Android 开发中,从原生的 HttpUrlConnection 到经典的 Apache 的 HttpClient,再到对前面这些网络基础框架的封装,比如 Volley.Async Http Client,Http 相关开源框架的选择还是很多的,其中由著名的 Square 公司开源的 Retrofit 更是以其简易的接口配置.强大的扩展支持.优雅的代码结构受到大家的追捧.也正是由于 Square 家的框架一如既往的简洁优雅,所以我一直在想,Square 公司是不是只招处女座的程序员? 1.初

RxJava + Retrofit完成网络请求

1.前言 本文基于RxJava.Retrofit的使用,若是对RxJava或Retrofit还不了解的简友可以先了解RxJava.Retrofit的用法再来看这篇文章. 在这片文章之前分别单独介绍过Rxjava以及Retrofit的使用: Android Retrofit 2.0 的使用 Android RxJava的使用(一)基本用法 2.使用 在了解了RxJava和Retrofit分别的用法后,RxJava.Retrofit的搭配使用也就不再话下了. 先看看使用Retrofit完成一次网络请

Android开发-浅谈架构(二)

写在前面的话 我记得有一期罗胖的<罗辑思维>中他提到 我们在这个碎片化 充满焦虑的时代该怎么学习--用30%的时间 了解70%该领域的知识然后迅速转移芳草鲜美的地方 像游牧民族那样.原话应该不是这样,但是我想说的是 自从我想写一些笔记记录知识的时候 为了不误导其他人 我不得不参考github 一些比较知名大牛的代码.在这个过程中 我下载过很多demo.一点一点的啃 汲取精华的部分 当然也充满疑惑.后来觉得标题取得有点大了 我应该取"学习"类的标题才对.但是另一方面我也只能就

浅谈 unix, linux, ios, android 区别和联系

浅谈 unix, linux, ios, android 区别和联系 网上的答案并不是很好,便从网上整理的相对专业的问答,本人很菜,大佬勿喷 UNIX 和 Linux ??UNIX 操作系统(尤尼斯), 是一个强大的多用户.多任务操作系统,支持多种处理器架构,按照操作系统的分类,属于分时操作系统,最早由 KenThompson.Dennis Ritchie和Douglas McIlroy于1969年在AT&T的贝尔实验室开发.目前它的商标权由国际开放标准组织所拥有,只有符合单一UNIX 规范的