美文网首页
Android使用Retrofit实现用户登录功能

Android使用Retrofit实现用户登录功能

作者: 伤口不该结疤 | 来源:发表于2021-03-18 13:11 被阅读0次

    准备工作

    在编写代码前,需要先弄清楚登录请求的基本信息,利用PostMan确认接口是可用的,再开始编写代码。登录接口需要的信息如下:
    1、接口的URL:https://xx/xx/login
    2、接口请求的方式: POST

    PostMan中设置接口的URL和请求方式

    3、需要的参数:用户名、密码
    4、服务器返回的数据格式:Boolean(注意:不同的服务器返回的值是不一样的,我们这里的例子返回的是Boolean)

    在拿到上面这些信息后,可以在PostMan进行配置&验证。下图是登录成功后的运行结果:


    PostMan中设置参数,点击Send运行

    如果输入一个错误的密码,服务器会返回false


    ,点击Send运行

    如果Reponse窗口中,没有返回正确的结果,说明你拿到的接口信息是有问题的


    请求接口有问题

    代码实现

    Retrofit版本

    1、在app/build.gradle中加入依赖

    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    

    2、定义请求的接口LoginAPI

    public interface LoginAPI {
      @POST("login")
      Call<Boolean> login(@Field("username") String name, @Field("password") String password);
    }
    
    • @POST表示请求方式,传入的参数login表示url中的method,url前面的那一串在创建Retrofit类时会进行设置,后面会讲到

    • 一个Call类型的方法表示一个请求,返回值为Boolean类型

    • 登录请求需要2个参数,使用@Field设置字段的名称,具体参数值,在调用login方法时传入

    • 注意: 如果运行时遇到错误:@Field parameters can only be used with form encoding. (parameter #1)

      需要加上@FormUrlEncoded注解

      public interface LoginAPI {
        @FormUrlEncoded
        @POST("login")
        Call<Boolean> login(@Field("username") String name, @Field("password") String password);
      }
      

    3、创建retrofit
    其中的BASE_URL就是https://xx/xx/login的前面这一串:https://xx/xx/

    Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    

    4、创建LoginAPI

    final LoginAPI loginAPI = retrofit.create(LoginAPI.class);
    

    5、创建请求

    Call<Boolean> call = loginAPI.login(name, password);
    

    6、执行请求

    call.enqueue(new Callback<Boolean>() {
            @Override
            public void onResponse(Call<Boolean> call, Response<Boolean> response) {
                Log.i(TAG, "onResponse: " + response.body());
            }
    
            @Override
            public void onFailure(Call<Boolean> call, Throwable t) {
                Log.w(TAG, "onFailure: " + t.getMessage() );
            }
    });
    

    7、AndroidManifest.xml中加入权限

      <uses-permission android:name="android.permission.INTERNET"/>
    

    8、运行程序,如果遇到crash报错:java.lang.BootstrapMethodError: Exception from call site #4 bootstrap method。需要在app/build.gradle加入如下配置:

    compileOptions {
        targetCompatibility = "8"
        sourceCompatibility = "8"
    }
    

    9、查看执行结果

    • 输入正确的用户名和密码:

      2021-03-18 12:07:10.693 8804-8804/com.example.retrofitdemo01 I/RetrofitDemo: onResponse: true
      
    • 输入一个错误的用户名或密码

      2021-03-18 12:07:48.545 8906-8906/com.example.retrofitdemo01 I/RetrofitDemo: onResponse: false
      
    • 输入的url有问题

      2021-03-18 12:08:15.842 9006-9006/com.example.retrofitdemo01 W/RetrofitDemo: onFailure: Unable to resolve host "xx": No address associated with hostname
      

    Retrofit + RxJava2.0 版本

    1、在app/build.gradle中加入依赖

    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'
    implementation 'io.reactivex.rxjava2:rxjava:2.2.21'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
    

    2、定义请求的接口RxLoginAPI

    public interface RxLoginAPI {
        @FormUrlEncoded
        @POST("login")
        Observable<Response<Boolean>> login(@Field("username") String name, @Field("password") String password);
    }
    

    3、创建Retrofit

    Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
    

    4、创建请求&调用

    retrofit.create(RxLoginAPI.class)
                .login(name, password)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Response<Boolean>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
    
                    }
    
                    @Override
                    public void onNext(Response<Boolean> booleanResponse) {
                        Log.i(TAG, "onNext: " + booleanResponse.body());
                    }
    
                    @Override
                    public void onError(Throwable e) {
                        Log.w(TAG, "onError: " + e.getMessage());
                    }
    
                    @Override
                    public void onComplete() {
    
                    }
                });
    

    5、查看运行结果

    • 输入正确的用户名和密码

      2021-03-18 12:41:47.299 9434-9434/com.example.retrofitdemo01 I/RetrofitDemo: onNext: true
      
    • 输入错误的用户名或密码

      2021-03-18 12:43:31.643 9552-9552/com.example.retrofitdemo01 I/RetrofitDemo: onNext: false
      
    • 输入错误的URL

      2021-03-18 12:44:09.265 9655-9655/com.example.retrofitdemo01 W/RetrofitDemo: onError: Unable to resolve host "xx": No address associated with hostname
      

    相关文章

      网友评论

          本文标题:Android使用Retrofit实现用户登录功能

          本文链接:https://www.haomeiwen.com/subject/hfvucltx.html