准备工作
在编写代码前,需要先弄清楚登录请求的基本信息,利用PostMan确认接口是可用的,再开始编写代码。登录接口需要的信息如下:
1、接口的URL:https://xx/xx/login
2、接口请求的方式: POST
3、需要的参数:用户名、密码
4、服务器返回的数据格式:Boolean(注意:不同的服务器返回的值是不一样的,我们这里的例子返回的是Boolean)
在拿到上面这些信息后,可以在PostMan进行配置&验证。下图是登录成功后的运行结果:
如果输入一个错误的密码,服务器会返回false
如果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