当前位置: 移动技术网 > IT编程>移动开发>Android > Android 网络框架 Retrofit

Android 网络框架 Retrofit

2018年09月13日  | 移动技术网IT编程  | 我要评论

出国作品集,扬州热线棋牌中心,exo鹿晗吸毒

概述

retrofit是一个okhttp网络请求框架的封装库,retrofit通过注解配置网络参数,可以按照我们的规则去构造实际的http请求,能够灵活设置url、头部、请求体、返回值等,是目前最优雅的一个网络框架。

引入

implementation 'com.squareup.retrofit2:retrofit:2.2.0'

implementation 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'//添加对rxjava的支持
implementation 'com.squareup.retrofit2:converter-gson:2.1.0' //添加json数据的支持

<uses-permission android:name="android.permission.internet"/>//网络请求必要的权限

retrofit基本使用三部曲

创建实例

 retrofit retrofit = new retrofit.builder()
          .baseurl("http://id1.option****.cc:***1/")//retrofit2 的baseulr 必须以 /(斜线) 结束
          .build();
retrofitservice service = retrofit.create(retrofitservice.class);//创建接口的代理对象

定义接口

public interface retrofitservice {
    
    @get("/pursuit/getpursuitinfo")
    call<responsebody> getblog(@query("id") int id);

    @get("/pursuit/getpursuitinfo/{id}")
    call<responsebody> getblog2(@path("id") string id);
    
}

创建 同步/异步 回调 

//异步的回调
call<responsebody> call = service.getblog(123);
call.enqueue(new callback<responsebody>() {
    @override
    public void onresponse(call<responsebody> call, retrofit2.response<responsebody> response) {
        try {
            log.i("返回信息",response.body().string()+"");//打印返回信息
        } catch (ioexception e) {
            e.printstacktrace();
        }

    }
    @override
    public void onfailure(call<responsebody> call, throwable t) {
        t.printstacktrace();//错误信息
    }
});

/*同步的回调,如果不是在一个activity或者一个fragment中去执行,那么也就意味着,你可以不需要开启子线程去执行网络请求。如果是在主线程,就必须开启子线程来进行同步请求
使用call.execute()同步请求,只能调用一次。如果要多次使用这个方法,需要 call.clone()重新生成新的call实例*/

new thread(new runnable() {
    @override
    public void run() {
        try {
            retrofit2.response<responsebody> response = call.execute();
            response.body();
        } catch (ioexception e) {
            e.printstacktrace();
        }
    }
});

http协议中的常用请求

get: 请求指定的页面信息,以?分割url和传输数据,参数之间以&相连,最多只能是1024字节,并返回实体主体,该操作用于获取信息而非修改信息

head: 只请求页面的首部。

post: post表示可能修改变服务器上的资源的请求,.post的安全性要比get的安全性高

put: 从客户端向服务器传送的数据取代指定文档的内容。

retrofit注解的重点详解

注解汇总

需要理解并灵活搭配使用

基本请求

responsebody是retrofit网络请求回来的原始数据类。get方式可以在url后面串联

@path注解用于替换请求参数,@query注解相当于url后面的串联,他们可以同时使用

请看下面第三种表达式:

@get("/pursuit/getpursuitinfo?id=123")
call<responsebody>  getcall();

@post("/pursuit/getpursuitinfo")
call<responsebody> getblog(@query("id") int id);

@get("/pursuit/getpursuitinfo/{id}")
call<responsebody> getblog2(@path("id") string id);

自定义请求

需要用到@http注解

/* method:网络请求的方法,注意大小写
 * path:网络请求地址路径
 * hasbody:是否有请求体
 * {id} 表示是一个变量*/
@http(method = "get", path = "/pursuit/getpursuitinfo/{id}", hasbody = false)
call<responsebody> getcall(@path("id") int id);

请求体非form表单

@body是post方式提交非form的表单

@post("/pursuit/getpursuitinfo")
observable<string> getpursuitinfo(@body user user);

请求体是form表单

如果请求的form表单,需要用@formurlencoded标注,@field注解用于表单字段,它和@fieldmap都需要@formurlencoded配合使用

@field和@query都是表单字段,@fieldmap和@query都是批量增加表单的提交域。区别如上图,一个拼接在url上适用于get方式,一个体现在请求体上试用于post方式,区分好使用场景。

@post("/pursuit/getpursuitinfo") 
@formurlencoded
call<responsebody> testformurlencoded1(@field("username") string name, @field("age") int age);

设置请求头

两种请求头的,@header用于添加不固定的请求头,作用于方法的参数。@headers用于添加固定的请求头,作用于方法

@headers("authorization: authorization")
@get("/pursuit/getpursuitinfo")
call<responsebody> getuser();

@get("/pursuit/getpursuitinfo")
call<responsebody> getuser(@header("authorization") string authorization);

动态替换url

用@url替换已经设置的baseurl

@get
public call<responsebody> profilepicture(@url string url);

图片上传

@post("user/updateavatar.do")
@multipart
call<responsebody> upload(@part("upload1\"; filename=\"image1.jpg\"") requestbody imgs );

文件上传

发送form-encoded的数据,用于有文件上传的场景时要用 @multipart 注解,@part和@partmap适用于有文件上传的情况

@post("mobile/upload")
@multipart
call<responsebody> upload(@part multipartbody.part file);

文件上传相关阅读

 轻松实现多文件/图片上传/json字符串/表单

 retrofit上传文件的参数设置

※以上就是所有参数注解的用法,需要实践灵活试用。

retrofit与gson

添加对gson的支持

retrofit retrofit = new retrofit.builder()
        .baseurl("http://id1.option****.cc:***1/")//retrofit2 的baseulr 必须以 /(斜线) 结束
        .addconverterfactory(gsonconverterfactory.create())//添加对gson的支持
        .build();

建立接口,返回bean

public interface postroute {
   @headers({"content-type: application/json","accept: application/json"})//需要添加头
   @post("api/flyroute/add")
   call<flyroutebean> postflyroute(@body requestbody route);//传入的参数为requestbody
}

将bean转换成json字符串

flyroutebean flyroutebean=new flyroutebean();
        flyroutebean=initdata(flyroutebean);//根据bean类初始化一个需要提交的数据类
        gson gson=new gson();
        string route= gson.tojson(flyroutebean);//通过gson将bean转化为json字符串形式 

提交json数据

requestbody body=requestbody.create(okhttp3.mediatype.parse("application/json; charset=utf-8"),route); //将json转换成requestbody请求体
call<flyroutebean> call=postroute.postflyroute(body);//提交

retrifit与rxjava

引入rxjava

compile 'io.reactivex.rxjava2:rxjava:2.1.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

 添加对rxjava的支持

retrofit retrofit = new retrofit.builder()
        .baseurl("http://id1.option****.cc:***1/")//retrofit2 的baseulr 必须以 /(斜线) 结束
        .addconverterfactory(gsonconverterfactory.create())//添加对gson的支持
        .addcalladapterfactory(rxjava2calladapterfactory.create())//添加对rxjava的支持
        .build();

建立接口,返回observable被观察者

@get("top250")
observable<movieentity> gettopmovie(@query("start") int start, @query("count") int count);

建立观察者

observable<string> observable =service.gettopmovie(0, 10)
    .subscribeon(schedulers.io())
    .observeon(androidschedulers.mainthread())
    .subscribe(new observer<responsebody>() {
        @override
        public void onsubscribe(disposable d) {

        }

        @override
        public void onnext(responsebody responsebody) {

        }

        @override
        public void onerror(throwable e) {

        }

        @override
        public void oncomplete() {

        }
    });

rxjava相关阅读

android异步框架 rxjava

retrofit代码混淆配置

-dontwarn retrofit.**
-keep class retrofit.** { *; }
-keepattributes signature
-keepattributes exceptions

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网