【Android项目实战 | 从零开始写app(四)】Okhttp+Gson实现服务端登录验证功能并保存Token值

本篇实现效果:

使用Okhttp3进行联网请求,通过post方法把用户名和密码发送到服务进行校验,使用Gson解析返回的json数据验证正确后,返回一个token值,并token值,username,password通过SharedPreferences 保存到本地,如下:
在这里插入图片描述

文章导航

一、【Android项目实战 | 从零开始写app(一)】 创建项目

二、【Android项目实战 | 从零开始写app(二)】实现闪屏页,启动app

三、【Android项目实战 | 从零开始写app(三)】实现引导页,进入登录or主页面

四、【Android项目实战 | 从零开始写app(四)】Okhttp+Gson实现服务端登录验证功能

五、【Android项目实战 | 从零开始写app(五)】okhttp+gson实现服务端注册功能

六、【Android项目实战 | 从零开始写app(六)】用TabLayout+ViewPager搭建App 框架主页面底部导航栏

七、【Android项目实战 | 从零开始写app(七)】优化主页导航栏,禁用主页页面滑动切换效果

八、【Android项目实战 | 从零开始写app(八)】实现app首页广告轮播图切换和搜索跳转

九、【Android项目实战 | 从零开始写app(九)】Tablayout+ViewPager实现页面分类顶部标题页面联动切换

十、【Android项目实战 | 从零开始写app(十)】Okhttp+glide+json+ListView实现新闻模块数据的填充显示

十一、【Android项目实战 | 从零开始写app(十一)】实现app首页智慧服务页面服务分类数据的解析及点击跳转

十二、【Android项目实战 | 从零开始写app(十二)】实现app首页智慧服务&热门推荐&热门主题、新闻

十三、【Android项目实战 | 从零开始写app(十三)】实现用户中心模块清除token退出登录&信息修改等功能

十四、【Android项目实战 | 从零开始写app(十四)】实现图片发布模块 | 必知必会之调用系统相机拍照、相册

十五、【Android项目实战 | 从零开始写app(教程汇总)】Android 项目实战系列汇总、源代码


项目目录:没有的就跟着新建如下

在这里插入图片描述

加载依赖&联网&设置(实现前提)

加载依赖:
注意在app目录下的build.gradle
在这里插入图片描述
在这里插入图片描述
加入如下依赖,接着Sync Now 同步一下:

implementation 'com.squareup.okhttp3:okhttp:3.10.0'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.github.bumptech.glide:glide:4.4.0'

联网配置:
在AndroidManifest清单文件中添加如下配置:
在这里插入图片描述

 android:usesCleartextTraffic="true"

权限:

 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.CAMERA" />
 <uses-permission android:name="android.permission.CAMERA" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-feature android:name="android.hardware.camera" />

还有另一种方式配置,但个人喜欢这种,简单方便。

逻辑功能实现:

LoginActivity.class:

package com.example.myapp.activity;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.Toast;

import com.example.myapp.MainActivity;
import com.example.myapp.R;
import com.example.myapp.bean.LoginBean;
import com.google.gson.Gson;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;


public class LoginActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText edt_name;
    private EditText edt_psw;
    private Button btn_login;
    private Button btn_register;
    private String token;
    private int code;
    private Intent intent = null;

    Handler handler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            if (msg==obtainMessage()) {
                Toast.makeText(getApplicationContext(),"登录成功",Toast.LENGTH_LONG).show();
            }
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        initView();
    }

    private void initView() {
        edt_name = (EditText) findViewById(R.id.edt_name);
        edt_psw = (EditText) findViewById(R.id.edt_psw);
        btn_login = (Button) findViewById(R.id.btn_login);
        btn_register = (Button) findViewById(R.id.btn_register);
        btn_login.setOnClickListener(this);
        btn_register.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_login:
                Login();
                break;
            case R.id.btn_register:
                intent = new Intent(LoginActivity.this,RegisterActivity.class);
                startActivity(intent);
                break;
        }
    }

    private void Login() {
        final String username =  edt_name.getText().toString().trim();
        final String password = edt_psw.getText().toString().trim();
        if (TextUtils.isEmpty(username )) {
            Toast.makeText(this, "请输入用户名", Toast.LENGTH_SHORT).show();
            return;
        } else if (TextUtils.isEmpty(password)) {
            Toast.makeText(this, "请输入密码", Toast.LENGTH_SHORT).show();
            return;
        } else if (true) {
            OkHttpClient client = new OkHttpClient();
            final JSONObject jsonObject = new JSONObject();

            try {//提交的参数
                jsonObject.put("username",username);
                jsonObject.put("password",password);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            MediaType mMediaType = MediaType.parse("application/json; charset=utf-8");
            final RequestBody requestBody = RequestBody.create(mMediaType, jsonObject.toString());
            Request request = new Request.Builder()
                    .post(requestBody)
                    .url("http://192.168.196.45:8080/login")
                    .build();
            okhttp3.Call call = client.newCall(request);
            call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    //请求失败
                    Log.i("请求情况:", "请求失败");
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    if (response.isSuccessful()) {
                        Log.i("响应状态", "响应成功");
                        final String loginBody = response.body().string();
                        Gson gson = new Gson();
                        LoginBean loginBean = gson.fromJson(loginBody, LoginBean.class);
                        String loginResultCode = loginBean.getCode();
                        Log.i("返回状态码", loginResultCode);
                        //响应成功,判断状态码
                        if (loginResultCode.equals("200")) {
                            Log.i("登录状态", "登录成功");
                            //获取token
                            token = loginBean.getToken();
                            // 把token保存到本地
                            SharedPreferences.Editor editor= getSharedPreferences("get_token", MODE_PRIVATE).edit();
                            editor.putString("token",token);
                            editor.putString("username",username);
                            editor.putString("password",password);
                            editor.apply();

                            //保存token
                            //登录成功,跳到主界面
                            Message message = handler.obtainMessage();
                            message.obj = token;
                            handler.sendMessage(message);
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(getApplicationContext(),loginBody,Toast.LENGTH_LONG).show();
                                }
                            });
                            startActivity(new Intent(LoginActivity.this, MainActivity.class));
                            finish();
                        } else {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(getApplicationContext(),"登录失败",Toast.LENGTH_LONG).show();
                                }
                            });
                        }
                    }

                }

            });
        }
    }


}


activity_login.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#8ABFE8"
    tools:context=".activity.LoginActivity">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="用户登录"
        android:layout_marginTop="50dp"
        android:textSize="30sp"
        android:textStyle="bold"
        android:textColor="#fff"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="200dp"
        android:orientation="vertical">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="230dp"
            android:layout_marginLeft="18dp"
            android:layout_marginRight="18dp"
            android:background="@drawable/shape_login_form"
            android:gravity="center"
            android:orientation="vertical"
            android:paddingLeft="43dp"
            android:paddingRight="31dp">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:orientation="horizontal">

                <ImageView
                    android:layout_width="25dp"
                    android:layout_height="25dp"
                    android:src="@mipmap/user1" />
                <EditText
                    android:id="@+id/edt_name"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="20dp"
                    android:background="@null"
                    android:hint="请输入用户名"
                    android:textColor="#000000"
                    android:text="liyingxia"
                    android:textColorHint="#bcbcbc"
                    android:textSize="18sp" />
            </LinearLayout>
            <View
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:layout_marginTop="23dp"
                android:layout_marginBottom="23dp"
                android:background="#e8e7e7" />
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:orientation="horizontal">
                <ImageView
                    android:layout_width="25dp"
                    android:layout_height="25dp"
                    android:src="@mipmap/psw" />
                <EditText
                    android:id="@+id/edt_psw"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="20dp"
                    android:background="@null"
                    android:text="123456"
                    android:inputType="textPassword"
                    android:hint="请输入密码"
                    android:textColor="#000000"
                    android:textColorHint="#bcbcbc"
                    android:textSize="18sp" />
            </LinearLayout>
        </LinearLayout>

        <LinearLayout
            android:layout_marginTop="50dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:layout_gravity="center_horizontal"
            android:orientation="horizontal">
            <Button
                android:id="@+id/btn_login"
                android:layout_width="100dp"
                android:layout_height="40dp"
                android:layout_alignParentLeft="true"
                android:text="登录"
                android:textColor="#ffffff"
                android:layout_marginLeft="50dp"
                android:background="@drawable/shape_login_btn"
                android:textSize="20sp" />
            <Button
                android:id="@+id/btn_register"
                android:layout_width="100dp"
                android:layout_height="40dp"
                android:layout_marginLeft="40dp"
                android:layout_marginRight="50dp"
                android:background="@drawable/shape_register_btn"
                android:layout_alignParentRight="true"
                android:text="注册"
                android:textColor="#136BC8"
                android:textSize="20sp" />
        </LinearLayout>
    </LinearLayout>
</RelativeLayout>

由于为美化页面,在drawable目录下新建:shape_register_btn.xml,shape_login_btn.xml,shape_login_form.xml

shape_register_btn.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="9dp" />
    <solid android:color="#FFFFFF" />
</shape>
shape_login_btn.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="9dp" />
    <solid android:color="#1276E1" />
</shape>
shape_login_form.xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape
            android:shape="rectangle"
            android:useLevel="false">
            <!-- 实心 -->
            <solid android:color="#ffffff" />
            <corners android:radius="10dp" />
            <padding
                android:bottom="10dp"
                android:left="10dp"
                android:right="10dp"
                android:top="10dp" />
        </shape>
    </item>
</layer-list>

实体类LoginBean:

package com.example.myapp.bean;

/**
 * @ProjectName: MyApp
 * @Package: com.example.myapp.bean
 * @ClassName: LoginBean
 * @Description:
 * @Author: liyingxia
 * @CreateDate: 2021/4/13 16:50
 */
public class LoginBean {


    /**
     * msg : 操作成功
     * code : 200
     * token : eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImMyYjE1YTNkLTlkNWQtNGFmZi04MGU3LTNlNWMxYTdkYzcyNSJ9.sZxcMsSvH7F50jCpTdtrv296mgq5IOI8OAo8rAXDQ4mw7KssvPsdwFcFdxHyGodfYmrsDxv0wyyEgDdl7JDxoQ
     */

    private String msg;
    private String code;
    private String token;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public LoginBean(String msg, String code, String token) {
        this.msg = msg;
        this.code = code;
        this.token = token;
    }

    @Override
    public String toString() {
        return "UserLogin{" +
                "msg='" + msg + '\'' +
                ", code=" + code +
                ", token='" + token + '\'' +
                '}';
    }
}

  • 18
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
好的,以下是JavaAndroid retrofit okhttp rxjava代码的示例: 首先,在build.gradle文件中添加以下依赖: ``` implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'io.reactivex.rxjava2:rxjava:2.2.10' ``` 然后,在你的Java类中,创建一个Retrofit实例: ```java public class RetrofitClient { private static Retrofit retrofit = null; public static Retrofit getClient(String baseUrl) { if (retrofit==null) { retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .client(getOkhttpClient()) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); } return retrofit; } private static OkHttpClient getOkhttpClient() { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); return new OkHttpClient.Builder().addInterceptor(interceptor).build(); } } ``` 接下来,在你的Activity或Fragment中,定义一个接口: ```java public interface ApiService { @GET("api/data/{category}/{count}/{page}") Observable<Results> getData(@Path("category") String category, @Path("count") int count, @Path("page") int page); } ``` 在这个示例中,我们使用了Retrofit和RxJava获取远程数据。 最后,在你的代码中,调用Retrofit客户端并使用RxJava观察获取到的数据: ```java ApiService apiService = RetrofitClient.getClient(BASE_URL).create(ApiService.class); apiService.getData(category, count, page) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<Results>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(Results results) { // 处理从服务器获取到的数据 } @Override public void onError(Throwable e) { // 处理请求错误 } @Override public void onComplete() { } }); ``` 这就是一个简单的Android retrofit okhttp rxjava代码的示例。当然,具体的实现方式会根据不同的需求而有所变化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值