andriod中使用retrofit进行网络请求【实战】

andriod中使用retrofit进行网络请求【实战】

andriod中使用retrofit进行网络请求【实战】

一 Retrofit2是什么?

Android Retrofit2是一个安全的为AndroidJava开发的Http访问框架,它是对OkHttp的进一步封装,它对应的的git地址和官网如下:
github地址:https://github.com/square/retrofit
官网:http://square.github.io/retrofit/

二、Retrofit2能做啥?

不需要自己封装具体的Http请求,线程切换以及数据转换等等
接口统一配置定义,且通过注解的方式设置参数,代码清晰,便于维护管理
可以与RxJava很轻松的关联使用
通过添加各种转换类,能讲response直接转换为需要的对象。

三、实战操作

在你的项目的build.gradle中dependencies区块下加入以下

    compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
    compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'

然后点击同步按钮

andriod中使用retrofit进行网络请求【实战】

如果没有报错,就表示同步成功了

我们现在又一个接口是这样的

http://www.bfw.wiki/Test/Login.html

通过post传递用户名与密码进行登录,post参数为username与userpwd

请求返回的数据格式为json

{"status":"201","data":"\u7528\u6237\u540d\u5bc6\u7801\u4e0d\u5bf9"}

status如果为200,表示登录成功,201表示出错,data就是提示的内容

那么怎么通过retrofit来获取我们所需要的数据呢

先建一个返回的数据实体类RetData。

package bfw.wiki.api;

public class RetData {
    private String status;
    private String data;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getData() {
        return data;
    }

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


然后新建一个Api的接口,主要放一下接口url的域名后面的部分

package bfw.wiki.api;

import com.squareup.okhttp.ResponseBody;

import retrofit.Call;
import retrofit.http.Field;
import retrofit.http.FormUrlEncoded;
import retrofit.http.Headers;
import retrofit.http.POST;
import retrofit.http.Query;

public interface API {
    @FormUrlEncoded
    @POST("Test/login")
    Call<RetData> Login(@Field("username") String username, @Field("userpwd")String userpwd);

}

我们看到retrofit的注解,POST后面是请求接口的路径,注意这里面我们没传接口的域名,由于域名相同,我们在后面会构造一个baseUrl

其中Call<RetData>表示我们请求接口后返回的数据格式json解码后转换的实体类RetData,@Field字段表示要传的post字段内容

@FormUrlEncoded表示采用表单的形式进行传输,这个要和Field结合使用,少了一个会报错,其他的注解如下:

请求方法

andriod中使用retrofit进行网络请求【实战】

请求参数

andriod中使用retrofit进行网络请求【实战】

最后我们build一个retrofit示例调用接口进行请求

public void login() {
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://www.bfw.wiki/")
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    API api = retrofit.create(API.class);

    Call<RetData> news_api = api.Login("bfw","bfw");

		news_api.enqueue(new Callback<RetData>() {


        @Override
        public void onResponse(Response<RetData> response, Retrofit retrofit) {
            Log.e("test",response.body().getData());
            //请求处理,输出结果-response.body().show();
        }

        @Override
        public void onFailure(Throwable throwable) {
            Log.e("fail",throwable.getMessage());
        }
    });
}

解释一下

.baseUrl("http://www.bfw.wiki/")

这个http://www.bfw.wiki/是我们要访问的接口的BaseUrl,而我们现在用post注解的字符串 "Test/Login"会追加到BaseUrl中变为:http://www.bfw.wiki/Test/Login
在我们日常开发中,BaseUrl具体是啥由后端接口童鞋给出,之后接口童鞋们会出各种各种的后缀(比如上面的 "Test/Login")组成各种各行的接口用来供移动端数据调用,实现各种各样的功能


.addConverterFactory(GsonConverterFactory.create())

这个有啥用?这句话的作用就是使得来自接口的json结果会自动解析成定义好了的字段和类型都相符的json对象接受类。在Retrofit 2.0中,Package 中已经没有Converter了,所以,你需要自己创建一个Converter, 不然的话Retrofit只能接收字符串结果,你也只能拿到一串字符,剩下的json转换的活还得你自己来干。所以,如果你想接收json结果并自动转换成解析好的接收类,必须自己创建Converter对象,然后使用addConverterFactory把它添加进来!
Retrofit支持多种数据解析方式,在使用时注意需要在Gradle添加依赖:

andriod中使用retrofit进行网络请求【实战】

news_api.enqueue(new Callback<RetData>() {

这段表示retrofit使用的是异步的方式进行http的请求,那么如果是同步应该这么写

Call<RetData> news_api=api=execute();

ok,我们运行一下用fiddler抓包试试

andriod中使用retrofit进行网络请求【实战】

成功了

下一章节我将带大家了解更多retrofit的更多方法,比如下载文件,证书请求等

{{collectdata}}

网友评论0