Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

Android开发学习(13)Retrofit访问REST服务

$
0
0

前段时间,有个博友在讨论区提了一个web封装的框架Retrofit,正好接上篇博客,我们搭建了一个简单的rest服务。

简介

准确来说,Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装,App应用程序通过 Retrofit 请求网络,实际上是使用 Retrofit 接口层封装请求参数、Header、Url 等信息,之后由 OkHttp 完成后续的请求操作,在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,Retrofit根据用户的需求对结果进行解析.

流程如下:
flow

步骤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;
        }


    }

效果:
restlogin

后台日志:
log

作者:xvshu 发表于2017/8/17 18:09:32 原文链接
阅读:30 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles