很久前就想学习下Retrofit了,不过总是没有时间,正好最近新项目要用到网络请求,正好研究了下Retrofit2.2的简单使用方法,大致记录如下:

Retrofit与okhttp共同出自于Square公司,retrofit就是对okhttp做了一层封装。网络请求依赖Okhttp,我们只需要通过简单的配置就能使用retrofit来进行网络请求了。

增加依赖:

    compile 'com.squareup.retrofit2:retrofit:2.2.0'//Retrofit2所需要的包
compile 'com.squareup.retrofit2:converter-gson:2.2.0'//ConverterFactory的Gson依赖包

这里需要值得注意的是导入的retrofit2包的版本必须要一致,否则就会报错。

这里我建立的请求地址 baseUrl 是  http://200.200.200.182:9999/

创建一个Retrofit对象:

Retrofit retrofit = new Retrofit.Builder()

                .baseUrl("http://200.200.200.182:9999/")
//增加返回值为Gson的支持(以实体类返回)
.addConverterFactory(GsonConverterFactory.create())
.build();

接着只需要定义对应请求的接口,用来返回一个Call对象,下面举个栗子:

假设,我需要一个登录用户的操作,服务端给我的API请求地址是:

http://200.200.200.182:9999/login

请求协议是json格式,如:

 {
"username" : "admin",
"password" : "123456"
}

@POST

这里先采用POST请求,使用注解@POST("login"),有如下两种方式:

方法一:

public interface RetrofitService
{
@FormUrlEncoded
@POST("login")
Call<ResponseBody> login(@Field("username") String username, @Field("password") String password);
}

方法二:

public interface RetrofitService
{
@Headers({"Content-type:application/json"})
@POST("login")
Call<ResponseBody> login(@Body User user);
}
//------------- User.java --------------------
/**
* Created by zyao89 on 2017/2/24.
*/
public class User
{
String username;
String password;
public User(String username, String password)
{
this.username = username;
this.password = password;
}
@Override
public String toString()
{
return "User{" +
"username='" + username + '/'' +
", password='" + password + '/'' +
'}';
}
}

接下来我们用之前的Retrofit对象创建一个mRetrofitService接口对象,也就是我们上面定义的那个RetrofitService接口,并且得到我们的Call对象,如下:

mRetrofitService = retrofit.create(RetrofitService.class);//这里采用的是Java的动态代理模式

接着用mRetrofitService调用我们上面定义的接口中方法,如:

public void login(View view)

    {
// 方法一
Call<ResponseBody> login = mRetrofitService.login("admin", "123456");
// 方法二
// User user = new User("admin", "123456");
// Call<ResponseBody> login = mRetrofitService.login(user);
login.enqueue(getCallback());
}

利用得到的Call对象,然后我们就发出网络请求了,这里介绍下enqueue是异步操作,execute()为同步操作。

private Callback<ResponseBody> getCallback()
{
return new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response)
{//请求成功
printLogCat("Code: " + response.code());
printLogCat("Message: " + response.message());
printLogCat("isSuccessful: " + response.isSuccessful());
try
{
printLogCat("Body: " + response.body().string());
}
catch (IOException e)
{
e.printStackTrace();
}
printLogCat("");
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t)
{//请求失败
printLogCat("ERROR: " + t.getMessage());
printLogCat("");
}
};
}

@GET

同样的协议,我们可以用GET请求来一遍,使用注解@ GET(""),有如下两种方式:

方式一:

public interface RetrofitService
{
@Headers({"Content-type:application/json"})
@GET("login")
Call<ResponseBody> login(@Query("username") String username, @Query("password") String password);
}
public void login(View view)
{
Call<ResponseBody> login = mRetrofitService.login("bacdd", "333444");
login.enqueue(getCallback());
}

请求URL:URL: /login?username=bacdd&password=333444

方法二:

public interface RetrofitService
{
@Headers({"Content-type:application/json"})
@GET("{url}")
Call<ResponseBody> login(@Path("url") String url, @Query("username") String username, @Query("password") String password);
}

@Path() 为占位符,可被参数动态替换;

public void login(View view)
{
Call<ResponseBody> login = mRetrofitService.login("login", "admin", "123444");
login.enqueue(getCallback());
}

请求URL:URL: /login?username= admin&password= 123444

@DELETE & @PUT

用法与前两者基本相同,这里就不阐述了;
参考代码如下:

    @Headers({"Content-type:application/json"})
@PUT("put")
Call<ResponseBody> put(@Body User user);
    @Headers({"Content-type:application/json"})
@HTTP(method = "DELETE", path = "/delete", hasBody = true)
Call<ResponseBody> delete(@Body DeleteID id);

备注下,Retrofit2.0以后,貌似DELETE请求是不可以带@Body参数的,所以,可改写成以上方式。

总结
@Path:所有在网址中的参数(URL的问号前面);
@Query:URL问号后面的参数;
@QueryMap:相当于多个@Query ;
@Field:用于POST请求,提交单个数据 ;(使用@Field时记得添加@FormUrlEncoded)
@Body:相当于多个@Field,以对象的形式提交

若需要重新定义接口地址,可以使用@Url,将地址以参数的形式传入即可。如:

@GET
Call<User> getUser(@Url String url);

												

Retrofit2.2说明-简单使用的更多相关文章

  1. 转载:Google 官方应用架构的最佳实践指南 赞👍

    官方给的实践指南,很有实际的指导意义,  特别是对一些小公司,小团队,给了很好的参考意义. 原文地址: https://developer.android.com/topic/libraries/ar ...

  2. 基于RxJava2+Retrofit2简单易用的网络请求实现

    代码地址如下:http://www.demodashi.com/demo/13473.html 简介 基于RxJava2+Retrofit2实现简单易用的网络请求,结合android平台特性的网络封装 ...

  3. Retrofit2.0起步篇

    retrofit 英文名字是改装的意思,也就是说他是对网络请求的一种改装,他不负责进行网络请求,他是对请求方式的一种封装.真正进行网络请求的是okhttp. 以下所有内容在Android Studio ...

  4. android快捷开发之Retrofit网络加载框架的简单使用

    大家都知道,安卓最大的特点就是开源化,这自然会产生很多十分好用的第三方API,而基本每一个APP都会与网络操作和缓存处理机制打交道,当然,你可以自己通过HttpUrlConnection再通过返回数据 ...

  5. Android 网络框架之Retrofit2使用详解及从源码中解析原理

    就目前来说Retrofit2使用的已相当的广泛,那么我们先来了解下两个问题: 1 . 什么是Retrofit? Retrofit是针对于Android/Java的.基于okHttp的.一种轻量级且安全 ...

  6. 让你Android开发更简单

    转载:http://www.jianshu.com/p/22ff8b5fdadc 搭建一个新的Android项目,你会怎么做? 每个人对应用框架的理解不相同,但是最终达到的效果应该是一样: ①降低项目 ...

  7. retrofit2中ssl的Trust anchor for certification path not found问题

    在retrofit2中使用ssl,刚刚接触,很可能会出现如下错误. java.security.cert.CertPathValidatorException: Trust anchor for ce ...

  8. Android--Retrofit+RxJava的简单封装(三)

    1,继续接着上一篇的讲讲,话说如果像上一篇这样的话,那么我们每一次请求一个结构都要创建一堆的Retrofit对象,而且代码都是相同的,我们可以试试封装一下 先创建一个HttpMethods类,将Ret ...

  9. Android--Retrofit的简单使用(一)

    1,如果不太了解retrofit的同学可以先去官网学习一下简单使用:http://square.github.io/retrofit/,这里我们以一个简单的Get请求的例子来练习一下 2,https: ...

随机推荐

  1. redis 使用内存超过maxmemory

    redis使用量超过了maxmemory,这时无法增加最大内存,redis 实例没有可用内存,导致命令都会执行失败 (error) OOM command not allowed when used ...

  2. Atitit.cateService分类管理新特性与设计文档说明v1

    Atitit.cateService分类管理新特性与设计文档说明v1 1. V2 新特性规划1 2. 分类管理1 3. 分类增加与修改维护2 4. Js控件分类数据绑定2 1. V2 新特性规划 增加 ...

  3. Atitit.编程语言原理---方法重载的实现与设计 调用方法的原理

    Atitit.编程语言原理---方法重载的实现与设计 调用方法的原理 1. 重载包括:普通方法的重载和构造方法的重载 1 1.1. 横向重载”和“纵向重载”1 1.2. 方法签名通过  方法名称,参数 ...

  4. hdu 4821 字符串hash+map判重 String (长春市赛区I题)

    http://acm.hdu.edu.cn/showproblem.php?pid=4821 昨晚卡了非常久,開始TLE,然后优化了之后,由于几个地方变量写混.一直狂WA.搞得我昨晚都失眠了,,. 这 ...

  5. CenterOS卸载和安装MYSQL

    1.首先在命令行输入mysql,看一下本地计算机上是否有mysql. 2.卸载mysql服务: 首先查看安装的rpm的包:rpm –qa |grep mysql    对之前的服务进行删除.rpm – ...

  6. Eclipse没有 web Project 选项的解决办法

    装下插件即可.步骤如下: 选择 Help >Software Updates >Find and Install.这个选项会让您可以下载和安装 Web 工具,且无需转到 Web 站点. 选 ...

  7. Unity学习笔记 - Assets, Objects and Serialization

    Assets和Objects Asset是存储在硬盘上的文件,保存在Unity项目的Assets文件夹内.比如:纹理贴图.材质和FBX都是Assets.一些Assets以Unity原生格式保存数据,例 ...

  8. Servlet Cookie 处理

    Servlet Cookie 处理 Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息.Java Servlet 显然支持 HTTP Cookie. 识别返回用户包括三个步骤: 服务 ...

  9. cvsba-1.0.0/utils/test_cvsba.cpp:.......error: ‘numeric_limits’ is not a member of ‘std’... error: expected primary-expression before ‘float’....

    cvsba库http://www.uco.es/investiga/grupos/ava/node/39,不知道怎么回事,记得以前编译没有错误,不知道作者是否更新了还是怎么着,新的现在有以下错误: 解 ...

  10. 打印99乘法表-python

    题目:如何打印出阶梯状的99乘法表? 题解: #coding:utf-8def multiplication_tables(num):#for i in range(1,10): for j in r ...