您的位置:首页 > 理论基础 > 计算机网络

Retrofit网络请求框架的简单使用

2018-03-20 20:38 337 查看
添加依赖

//retrofit
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'

加权限

<!--权限-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

初始化retrofit

public class RetrofitUtil {

public static RetrofitUtil retrofitUtil;
public String url;
private final Retrofit retrofit;

//初始化retrofit
public RetrofitUtil(String url) {
this.url = url;
//添加拦截器
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new RetrofitIntercepter()).build();
retrofit = new Retrofit.Builder().baseUrl(url)
.addConverterFactory(GsonConverterFactory.create(new Gson()))
//                .client(client)
.build();
}

//拦截器     拦截器有点问题--
class RetrofitIntercepter implements Interceptor {

@Override
public Response intercept(Chain chain) throws IOException {

Request request = chain.request();
RequestBody body = request.body();
if (body instanceof FormBody) {
FormBody.Builder builder = new FormBody.Builder();
for (int i = 0; i < ((FormBody) body).size(); i++) {
String key = ((FormBody) body).name(i);
String value = ((FormBody) body).value(i);
builder.add(key, value);
}
builder.add("source", "android");
FormBody formBody = builder.build();
Request request1 = request.newBuilder().post(formBody).build();
Response response = chain.proceed(request1);
return response;
}

return null;
}
}

//通过反射实现子类
public <T> T getUserData(Class<T> clz) {
T t = retrofit.create(clz);
return t;
}

//单利模式
public static RetrofitUtil getInstance(String u) {
if (retrofitUtil == null) {
retrofitUtil = new RetrofitUtil(u);
}
return retrofitUtil;
}
//


retrofit是通过注解的形式配置网络请求参数,所以创建接口  反射子类

public interface RetrofitService {
//get请求  product/getProductDetail?source=android&pid=12
@GET("product/getProductDetail")
Call<UserBean> getList(@Query("pid") String pid);

//get请求  product/getProductDetail?source=android&pid=12
@POST("product/getProductDetail")
Call<UserBean> getList_post(@Query("pid") String pid);
}


主方法    开始调用   retrofit

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private Button get;
private Button post;
private TextView tv;
private static final String TAG = "MainActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化界面
initView();

}

private void initView() {
get = (Button) findViewById(R.id.get);
post = (Button) findViewById(R.id.post);
tv = (TextView) findViewById(R.id.tv);

get.setOnClickListener(this);
post.setOnClickListener(this);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.get:
//初始化retrofit
RetrofitUtil.getInstance(HttpConfig.baseUrl).getUserData(RetrofitService.class).getList("12").enqueue(new Callback<UserBean>() {
@Override
public void onResponse(Call<UserBean> call, Response<UserBean> response) {
Log.d(TAG, "onResponse: ===========" + response.body().getMsg());
tv.setText(response.body().getMsg());
}

@Override
public void onFailure(Call<UserBean> call, Throwable t) {

}
});
break;
case R.id.post:
RetrofitUtil.getInstance(HttpConfig.baseUrl).getUserData(RetrofitService.class).getList_post("12").enqueue(new Callback<UserBean>() {
@Override
public void onResponse(Call<UserBean> call, Response<UserBean> response) {
tv.setText(response.body().getMsg());
}

@Override
public void onFailure(Call<UserBean> call, Throwable t) {

}
});
break;
}
}
}


1.基于OKhttp网络请求       遵循RESTful API设计风格
2.通过注解的方式配置网络请求参数    ----简单明了,简洁易懂
3.支持多种数据解析&序列化格式  (如:gson json xml)
4.支持同步 异步请求
5.提供对rxjava的支持   --- 拓展性好
  解耦彻底.封装好
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: