前段时间,有个博友在讨论区提了一个web封装的框架Retrofit,正好接上篇博客,我们搭建了一个简单的rest服务。
简介
准确来说,Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装,App应用程序通过 Retrofit 请求网络,实际上是使用 Retrofit 接口层封装请求参数、Header、Url 等信息,之后由 OkHttp 完成后续的请求操作,在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,Retrofit根据用户的需求对结果进行解析.
流程如下:
步骤1:添加Retrofit库的依赖
步骤2:创建 接收服务器返回数据 的类
步骤3:创建 用于描述网络请求 的接口
步骤4:创建 Retrofit 实例
步骤5:创建 网络请求接口实例 并 配置网络请求参数
步骤6:发送网络请求(异步 / 同步)
封装了 数据转换、线程切换的操作
步骤7: 处理服务器返回的数据
引入步骤
maven
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>converter-wire</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>converter-gson</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.1</version>
</dependency>
封装Retrofit相关
package com.xvshu.android.web.common;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.converter.wire.WireConverterFactory;
/**
* Created by xvshu on 2017/8/16.
*/
public class RetrofitUtils {
private static String baseUrl = "http://172.30.53.58:8080/rest/";
private static Retrofit retrofit = null;
public static Retrofit getRetrofit(){
if(retrofit==null){
retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.addConverterFactory(WireConverterFactory.create())
.baseUrl(baseUrl)
.build();
}
return retrofit;
}
public static <T> T genService(Class<T> tClass)throws InstantiationException {
return getRetrofit().create(tClass);
}
}
定义service
package com.xvshu.android.web;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Path;
/**
* Created by xvshu on 2017/8/16.
*/
public interface UseService {
@GET("user/android/{userName}/{passWord}")
Call<String> login(@Path("userName") String userName,@Path("passWord") String passWord);
}
具体访问
重写登录代码:
@Override
public void onClick(View v) {
final String userid = useridEt.getText().toString().trim();
final String pass = passEt.getText().toString().trim();
if(userid.equals("")){
promptText.setText("用户名为空");
return ;
}
if(pass.equals("")){
promptText.setText("密码为空");
return ;
}
Boolean isLoginSucess = false;
try {
UseService useService = RetrofitUtils.genService(UseService.class);
Call<String> repos =useService.login(userid,pass);
repos.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
Log.i("loginOnFailure", response.body().toString());
if (response.body().equals("true")) {
Toast.makeText(RetrofitActivity.this, "Rest登录成功!", Toast.LENGTH_LONG).show();
if(cbRememberPass.isChecked()) {
//记住用户名、密码、
SharedPreferences.Editor editor = spUser.edit();
editor.putString(spKeyUser, userid);
editor.putString(spKeyPass,pass);
editor.commit();
}else{
//不记住用户名、密码
SharedPreferences.Editor editor = spUser.edit();
editor.putString(spKeyUser, "");
editor.putString(spKeyPass,"");
editor.commit();
}
Intent intent_hello = new Intent(RetrofitActivity.this, HelloActivity.class);
startActivity(intent_hello);
} else {
Toast.makeText(RetrofitActivity.this, "登录失败", Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(Call<String> call, Throwable throwable) {
Log.e("loginOnFailure", throwable.getMessage(),throwable);
}
}
);
}catch (Exception ex){
Log.e("=RetrofitUtils=>","RetrofitUtils.genService(UseService.class)",ex);
isLoginSucess=false;
}
}
效果:
后台日志:
作者:xvshu 发表于2017/8/17 18:09:32 原文链接
阅读:30 评论:0 查看评论