如何在 android 中通过改造处理 206 代码?
how to handle 206 code with retrofit in android?
我是改装新手,我想处理代码 206。
所以基本上我调用我的休息 api 并得到一个 Observable 但我不知道如何处理结果以及如何在需要时再次调用 api。
例如:
Observable<CompanyListRest> vAllCompanyList = api.findAllCompanys1WithParams(vParamsMap);
会调用我的api(参数是起始索引和要获取的元素数)
但如何对重复动作进行编码。
我尝试使用 onNext 添加订阅者,但它不起作用
抱歉,如果不清楚,
谢谢
更新和解决方案:
我关注 Azim Salimov 的 znswer
Observable<Response<CompanyListRest>> vAllCompanyListResponse = api.findAllCompanys1WithParams();
vAllCompanyListResponse.subscribe(new Observer<Response<CompanyListRest>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Response <CompanyListRest> pCompanyListRest) {
if(pCompanyListRest.code() == 206){
vAllCompanyList.addAll(pCompanyListRest.body().getCompany());
// change parameters of search
vAllCompanyListResponse.retry().subscribe(this::onNext);
} else if( pCompanyListRest.code() == 200){
return;
}
}
这很好用!
嗯,你的问题不是很清楚,但如果你想重复一个动作,你可以使用“接口”。
例如这是我的 ApiInterface
public interface ApiInterface {
@POST("register.php")
Call<User> regCall(@Query("name") String Name, @Query("username") String UserName, @Query("email") String email, @Query("password") String Password);
@GET("login.php")
Call<User> loginCall(@Query("username") String UserName,@Query("email") String email, @Query("password") String Password);
}
这是我的ApIclass
public class API {
private static final String BASE_URL = "http://192.168.1.6/uni/";
public static Retrofit myRetrofit = null;
public static Retrofit getAPI() {
if (myRetrofit == null) {
myRetrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return myRetrofit;
}
当我想在 activity
中使用它时
apiInterface = API.getAPI().create(ApiInterface.class);
和
Call<User> logCall = MainActivity.apiInterface.loginCall(logUser, logEmail, logPassword);
logCall.enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
if (Objects.requireNonNull(response.body()).getApiResposnse().equals("SUCCESS")) {
Toast.makeText(getActivity(), "You login successfully!", Toast.LENGTH_SHORT).show();
prefManager.setLogin(true);
prefManager.createLoginSession(logUser,logEmail);
Intent i = new Intent(getActivity(), firstPage.class);
startActivity(i);
Objects.requireNonNull(getActivity()).finish();
} else if (response.body().getApiResposnse().equals("FAILED")) {
Toast.makeText(getActivity(), "LoginFragment failed!", Toast.LENGTH_SHORT).show();
Toast.makeText(getActivity(), "Username or Password incorrect. please try again", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<User> call, Throwable t) {
String loginError = "Connection Error!";
Toast.makeText(getContext(), loginError + t, Toast.LENGTH_SHORT).show();
}
});
您可以将 CompanyListRest
响应包装在 Response
内,如下所示:
Observable<Response<CompanyListRest>>
Response
来自 retrofit2:
import retrofit2.Response;
现在您可以在 onNext
方法中检查 206 的响应代码:
@Override
public void onNext(Resposne<CompanyListRest> response) {
int statusCode = response.code();
if(statusCode == 206){
//do something...
}
}
要再次调用此函数,只需再次调用此函数即可)。
我建议您拥有一个可以控制所有请求的存储库。
我是改装新手,我想处理代码 206。
所以基本上我调用我的休息 api 并得到一个 Observable 但我不知道如何处理结果以及如何在需要时再次调用 api。
例如:
Observable<CompanyListRest> vAllCompanyList = api.findAllCompanys1WithParams(vParamsMap);
会调用我的api(参数是起始索引和要获取的元素数) 但如何对重复动作进行编码。
我尝试使用 onNext 添加订阅者,但它不起作用
抱歉,如果不清楚, 谢谢
更新和解决方案:
我关注 Azim Salimov 的 znswer
Observable<Response<CompanyListRest>> vAllCompanyListResponse = api.findAllCompanys1WithParams();
vAllCompanyListResponse.subscribe(new Observer<Response<CompanyListRest>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Response <CompanyListRest> pCompanyListRest) {
if(pCompanyListRest.code() == 206){
vAllCompanyList.addAll(pCompanyListRest.body().getCompany());
// change parameters of search
vAllCompanyListResponse.retry().subscribe(this::onNext);
} else if( pCompanyListRest.code() == 200){
return;
}
}
这很好用!
嗯,你的问题不是很清楚,但如果你想重复一个动作,你可以使用“接口”。 例如这是我的 ApiInterface
public interface ApiInterface {
@POST("register.php")
Call<User> regCall(@Query("name") String Name, @Query("username") String UserName, @Query("email") String email, @Query("password") String Password);
@GET("login.php")
Call<User> loginCall(@Query("username") String UserName,@Query("email") String email, @Query("password") String Password);
}
这是我的ApIclass
public class API {
private static final String BASE_URL = "http://192.168.1.6/uni/";
public static Retrofit myRetrofit = null;
public static Retrofit getAPI() {
if (myRetrofit == null) {
myRetrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return myRetrofit;
}
当我想在 activity
中使用它时apiInterface = API.getAPI().create(ApiInterface.class);
和
Call<User> logCall = MainActivity.apiInterface.loginCall(logUser, logEmail, logPassword);
logCall.enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
if (Objects.requireNonNull(response.body()).getApiResposnse().equals("SUCCESS")) {
Toast.makeText(getActivity(), "You login successfully!", Toast.LENGTH_SHORT).show();
prefManager.setLogin(true);
prefManager.createLoginSession(logUser,logEmail);
Intent i = new Intent(getActivity(), firstPage.class);
startActivity(i);
Objects.requireNonNull(getActivity()).finish();
} else if (response.body().getApiResposnse().equals("FAILED")) {
Toast.makeText(getActivity(), "LoginFragment failed!", Toast.LENGTH_SHORT).show();
Toast.makeText(getActivity(), "Username or Password incorrect. please try again", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<User> call, Throwable t) {
String loginError = "Connection Error!";
Toast.makeText(getContext(), loginError + t, Toast.LENGTH_SHORT).show();
}
});
您可以将 CompanyListRest
响应包装在 Response
内,如下所示:
Observable<Response<CompanyListRest>>
Response
来自 retrofit2:
import retrofit2.Response;
现在您可以在 onNext
方法中检查 206 的响应代码:
@Override
public void onNext(Resposne<CompanyListRest> response) {
int statusCode = response.code();
if(statusCode == 206){
//do something...
}
}
要再次调用此函数,只需再次调用此函数即可)。 我建议您拥有一个可以控制所有请求的存储库。