Retrofit基本介绍和简单的使用方式

Retrofit:Android和Java的类型安全的HTTP客户端。

Introduction:

1.Retrofit把你的HTTP API转换成Java接口

<span style="font-size:14px;">public interface GitHubService {
  @GET("users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}</span>

2.Retrofit类去实现GitHubService的接口

<span style="font-size:14px;">Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .build();

GitHubService service = retrofit.create(GitHubService.class);</span>

3.每个Call去创建GitHubService可以实现同步或者异步去请求远程网络服务器

<span style="font-size:14px;">Call<List<Repo>> repos = service.listRepos("octocat");</span>

使用注解去描述HTTP请求:

1.支持URL参数替换和查询参数

2.对象转换为请求主体(例如,JSON,协议缓冲区)

3.Multipart请求主体和文件上传

API Declaration:

在接口方法及其参数注释指示请求将如何处理。

1.REQUEST METHOD(请求方法):

每个方法都必须有一个HTTP注释提供的请求方法和相对URL。有五个内置的注释:GET, POST, PUT, DELETE, and HEAD。资源的相对URL在注释中指定。

例如:

<span style="font-size:14px;">@GET("users/list")</span>

还可以指定URL的查询参数,例如:

<span style="font-size:14px;">@GET("users/list?sort=desc")</span>

2.URL MANIPULATION(URL操作):

请求的URL可以动态使用的方法替换块和参数进行更新。替换使用{},里面是字母数字字符串,相应的参数必须与@path注释使用相同的字符串。

例如:

<span style="font-size:14px;">@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);</span>

查询参数也可以被添加,例如:

<span style="font-size:14px;">@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);</span>

对于复杂的查询参数组合可以使用map,例如:

<span style="font-size:14px;">@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);</span>

3.REQUEST BODY(请求体):

一个对象可以作为一个HTTP请求正文使用的@Body注解指定,例如:

<span style="font-size:14px;">@POST("users/new")
Call<User> createUser(@Body User user);</span>

该对象也将被使用在retrofit实例指定一个转换器转换。如果没有添加转换器,仅仅RequestBody可以被使用。

4.FORM ENCODED AND MULTIPART(表单和多表单):

方法也可以声明发送form-encoded 和multipart data。

form-encoded数据发送当@FormUrlEncoded方法存在时,每一个key-value使用注解@Field包含名称和提供该值的对象,例如:

<span style="font-size:14px;">@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);</span>

多请求被使用当@Multipart存在方法上时,声明部分使用@Part注解,例如:

<span style="font-size:14px;">@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);</span>

Multipart parts使用一个Retrofit的转换器或者他们可以实现RequestBody来处理自己的序列化。

5.HEADER MANIPULATION(处理请求头):

你可以设置使用@Headers注释静态头的方法,例如:

<span style="font-size:14px;">@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
Call<List<Widget>> widgetList();</span>

多个请求头,例如:

<span style="font-size:14px;">@Headers({
    "Accept: application/vnd.github.v3.full+json",
    "User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call<User> getUser(@Path("username") String username);</span>

注意头不会互相覆盖。具有相同名称的所有头将被包括在该请求。

一个请求头使用@Header注释可以动态更新。@Header必须提供相应的参数。如果该值为null,头就会被忽略掉。否则,toString将被回调这个value,使用其结果,例如:

<span style="font-size:14px;">@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)</span>

需要被添加到每请求头可以用一个OkHttp拦截来指定。

6.SYNCHRONOUS VS. ASYNCHRONOUS(同步VS异步):

call实例可以被同步或异步执行,每一个实例只能使用一次,但是使用clone()方法将创建新的实例被使用。

在Android中,回调函数将在主线程上执行,在JVM虚拟机上,回调函数会发生在同一线程执行HTTP请求。

Retrofit Configuration(配置)

Retrofit是API接口的类转化为可调用的对象。retorfit将为你的平台提供健全的默认值但是它允许定制。

CONVERTERS(转换器):

默认情况下,retrofit只能反序列化okhttp中的ResponseBody类型和它只能接受其@Body RequestBody类型。

转换器可以添加到其他类型的支持,以下是6个常用的序列化库:

<span style="font-size:14px;">Gson: com.squareup.retrofit2:converter-gson</span>
<span style="font-size:14px;">Jackson: com.squareup.retrofit2:converter-jackson</span>
<span style="font-size:14px;">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</span>

Retrofit的基本配置项目中的使用

Android studio中的配置Retrofit在gradle添加依赖:

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

如果使用的解析方式是Gson,添加converter-gson:

compile 'com.squareup.retrofit2:converter-gson:2.1.0'

Retrofit需要至少Java 7或Android 2.3。

一个简单使用Retrofit中的例子

1.首先聚合上申请的接口,身份证查询:

地址:http://apis.juhe.cn/idcard/index?key=您申请的KEY&cardno=330326198903081211

2.这里根据输入身份证号获取个人的基本信息,接下来创建接口:

<span style="font-size:14px;">public interface UserCardnoService {
    //基本信息查询
    @GET("/idcard/index")
    Call<InforBean> getInfoResult(@Query("key") String key, @Query("cardno") String cardno);
    //信息是否泄漏
    @GET("/idcard/leak")
    Call<LeakBean> getLeakResult(@Query("key") String key, @Query("cardno") String cardno);
    //身份证是否挂失
    @GET("/idcard/loss")
    Call<LossBean> getLossResult(@Query("key") String key, @Query("cardno") String cardno);
}</span>

3.创建实体类,这里放的实体类是基本信息的查询:

<span style="font-size:14px;">public class InforBean {

    /**
     * resultcode : 200
     * reason : 成功的返回
     * result : {"area":"浙江省温州市平阳县","sex":"男","birthday":"1989年03月08日"}
     */
    public String resultcode;
    public String reason;
    public int error_code;
    /**
     * area : 浙江省温州市平阳县
     * sex : 男
     * birthday : 1989年03月08日
     */

    public ResultBean result;

    public static class ResultBean {
        public String area;
        public String sex;
        public String birthday;

        public String getArea() {
            return area;
        }

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

        public String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
        }

        public String getBirthday() {
            return birthday;
        }

        public void setBirthday(String birthday) {
            this.birthday = birthday;
        }
    }

    public String getResultcode() {
        return resultcode;
    }

    public void setResultcode(String resultcode) {
        this.resultcode = resultcode;
    }

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }

    public int getError_code() {
        return error_code;
    }

    public void setError_code(int error_code) {
        this.error_code = error_code;
    }

    public ResultBean getResult() {
        return result;
    }

    public void setResult(ResultBean result) {
        this.result = result;
    }
}</span>

4.创建用户信息查询的类UserInfoActivity,构建retrofit实例访问接口,解析数据,对数据进行赋值:

<span style="font-size:14px;">public class UserInfoActivity extends AppCompatActivity implements View.OnClickListener {

    public static final String TAG = "UserInfoActivity";

    private EditText mEtInput;
    private Button btnQuery;
    private TextView mTvArea;
    private TextView mTvSex;
    private TextView mTvBirthday;
    private LinearLayout llInfo;

    private String mCardno;

    private Context mContext;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = UserInfoActivity.this;
        setContentView(R.layout.base_layout);
        initView();
    }

    private void initView() {
        mEtInput = (EditText) findViewById(R.id.etInput);
        btnQuery = (Button) findViewById(R.id.btnQuery);
        mTvArea = (TextView) findViewById(R.id.tvArea);
        mTvSex = (TextView) findViewById(R.id.tvSex);
        mTvBirthday = (TextView) findViewById(R.id.tvBirthday);
        llInfo = (LinearLayout) findViewById(R.id.ll_Info);
        btnQuery.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        mCardno = mEtInput.getText().toString().trim();
        if (!mCardno.matches(RegexpUtils.USER_CARD)) {
            Toast.makeText(mContext, "输入有误,请重新输入!", Toast.LENGTH_SHORT).show();
        } else {
            getNetData();
        }
    }

    private void getNetData() {
        //构建rtrofit实例
        Retrofit retrofit = new Retrofit
                .Builder()
                .baseUrl(GlobalContact.BASEURL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        UserCardnoService infoService = retrofit.create(UserCardnoService.class);

        Call<InforBean> call = infoService.getInfoResult(GlobalContact.KEY, mCardno);

        call.enqueue(new Callback<InforBean>() {
            @Override
            public void onResponse(Call<InforBean> call, Response<InforBean> response) {
                Log.i(TAG, "onResponse: " + response.body().toString());
                if (response.isSuccessful()) {
                    llInfo.setVisibility(View.VISIBLE);
                    //对数据进行赋值
                    mTvArea.setText(response.body().result.area);
                    mTvSex.setText(response.body().result.sex);
                    mTvBirthday.setText(response.body().result.birthday);
                } else {
                    llInfo.setVisibility(View.GONE);
                }
            }

            @Override
            public void onFailure(Call<InforBean> call, Throwable t) {
                Log.i(TAG, "onFailure: " + t.toString());
            }
        });
    }
}</span>

好久就听说的一直没用过,现在很后悔,Retrofit2.0太强大了。

Retrofit官网

Retrofit源码

时间: 2024-09-29 04:26:58

Retrofit基本介绍和简单的使用方式的相关文章

Android反编译工具介绍与简单实用方法

Android反编译工具介绍与简单实用方法 Android反编译的目的无非就是为了看到APK的xml.资源和代码: 得到代码的方式:直接解压APK文件 --> 得到classes.dex文件 --> 使用 dex2jar classes.dex classes.jar生成jar文件 --> [可选的解压jar文件] -->使用XJad或者JDCompiler查看源代码 得到XML的方式: 方式1:直接解压APK文件 --> 通过axmlprinter工具查看XML文件(这种方

进击的Python【第十二章】:mysql介绍与简单操作,sqlachemy介绍与简单应用

进击的Python[第十二章]:mysql介绍与简单操作,sqlachemy介绍与简单应用 一.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢.所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量.所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来

WebRTC介绍及简单应用

WebRTC介绍及简单应用 WebRTC,即Web Real-Time Communication,web实时通信技术.简单地说就是在web浏览器里面引入实时通信,包括音视频通话等. WebRTC实时通信技术介绍 如何使用 媒体介绍 信令 STUN和TURN介绍 对等连接和提议/应答协商 数据通道 NAT和防火墙穿透 简单应用 其它 WebRTC实时通信技术介绍 WebRTC实现了基于网页的语音对话或视频通话,目的是无插件实现web端的实时通信的能力. WebRTC提供了视频会议的核心技术,包括

消息队列介绍、RabbitMQ&amp;Redis的重点介绍与简单应用

消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下消息队列的基本思路. 还记得原来写过Queue的文章,不管是线程queue还是进程queue他都是一种消息队列.他都是基于生产者消费者模型来处理消息. Python中的进程queue,是用于父进程与子进程,或者同属于一个父进程下的多个子进程之间进行信息交互.注意这种queue只能在同一个python程序下才能用,如果两个python程序,或者Python和别的什么程序,

用简单直白的方式讲解A星寻路算法原理

很多游戏特别是rts,rpg类游戏,都需要用到寻路.寻路算法有深度优先搜索(DFS),广度优先搜索(BFS),A星算法等,而A星算法是一种具备启发性策略的算法,效率是几种算法中最高的,因此也成为游戏中最常用的寻路算法. 直入正题: 在游戏设计中,地图可以划分为若干大小相同的方块区域(方格),这些方格就是寻路的基本单元. 在确定了寻路的开始点,结束点的情况下,假定每个方块都有一个F值,该值代表了在当前路线下选择走该方块的代价.而A星寻路的思路很简单:从开始点,每走一步都选择代价最小的格子走,直到达

玩转web之servlet(六)---session介绍及简单使用(登录验证中保存信息)

在浏览器与服务器进行交互时,往往需要把涉及到的一些数据保存下来,这时就需要使用cookie或session进行状态管理. 这篇文章先来说说session怎么用,首先在servlet中创建一个session来保存信息,举个例子,在做登陆验证时,如果登陆成功,需要将用户的信息保存到session中,怎么保存呢?下面给出代码: public class Login_Do extends HttpServlet { String order_name = ""; String order_pa

Json.Net的介绍与简单实用(兼容2.0/3.0/3.5/4.5/RT)

本文的前提是你已经熟悉Json,如果您还不知道什么是Json是什么,请自行查看维基百科. 一.Json.Net是什么? Json.Net是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过Linq To JSON可以快速的读写Json,通过JsonSerializer可以序列化你的.Net对象.让你轻松实现.Net中所有类型(对象,基本数据类型 等)和Json的转换. 二.为什么使用Json.Net? 我们知道在.Net中内置了读写Json

(三)AJAX基本介绍和简单实例03

AJAX基本介绍和简单实例03-----Ajax与数据库的动态应用 初始界面: 选择所有用户后显示的界面: 查询姓名为杜森的客户,结果如下: Demo03.html代码如下: <html> <meta http-equiv="content-type" content="text/html" charset="utf-8"/> <head> <style> body { background:#CC

JavaScript高级 面向对象(5)--最简单的继承方式,混入mix

说明(2017.3.30): 1. 最简单的继承方式,混入mix 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 </head> 7 <body> 8 <script type="text/javascrip