我使用改造库调用HTTP请求,并从API获取结果。我在改型库中配置了日志,所以我可以看到发生了什么。响应是简单的原始整数类型。 问题是它总是返回零。响应类(LoginModel)也是经典类,对于整数类型,它具有一个setter和一个getter。
Log.i("BODY : ", String.valueOf(response.body().getResult()));
下面的图像是我的日志,您可以看到我收到响应10,但是当我在onResponse函数中记录 getResult 时,它始终打印为零。
Call<LoginModel> isSended = apiService.sendCode(phoneNumber);
isSended.enqueue(new Callback<LoginModel>() {
@Override
public void onResponse(Call<LoginModel> call, Response<LoginModel> response) {
Log.i("BODY : ", String.valueOf(response.body().getResult()));
if (!response.isSuccessful()) {
Toast.makeText(context, context.getResources().getString(R.string.errorServer), Toast.LENGTH_LONG).show();
dismissProgressBarDialog();
return;
}
myTimer = new MyTimer(SECOND_TIME, 1000);
views.reactionActivationPress(response.body().getResult());
}
@Override
public void onFailure(Call<LoginModel> call, Throwable t) {
Log.i(Constant.NETWORK_LOG, "sendCode : " + t.toString());
dismissProgressBarDialog();
Toast.makeText(MyApplication.getContext(), "Server Problem", Toast.LENGTH_LONG).show();
}
});
我不知道怎么了。感谢您的帮助。谢谢
更新:调用API的完整代码
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.addInterceptor(loggingInterceptor)
.addInterceptor(chain -> {
Request request = chain.request();
Request newRequest;
newRequest = request.newBuilder()
.addHeader(HEADER_VERSION_CODE, String.valueOf(BuildConfig.VERSION_CODE))
.build();
return chain.proceed(newRequest);
})
.build();
Gson gson = new GsonBuilder()
.setLenient()
.create();
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
Gson和改造创建代码:
astring = "apple"
bstring = "_ " * 5
print(bstring)
my_input = input("enter a letter")
for i, n in enumerate(astring):
if my_input == i:
bstring[n] = my_input
else:
i = i + 1
print(bstring)
答案 0 :(得分:4)
代码没有问题。它运作良好。 确保您在翻新时使用了Gson。 我已经测试了代码并正常工作。无需在模型类中进行更改。
答案 1 :(得分:3)
您在代码中发出的问题是您尝试以响应方式访问结果两次,请尝试以下操作
仅声明一次response.body().getResult()
Call<LoginModel> isSended = apiService.sendCode(phoneNumber);
isSended.enqueue(new Callback<LoginModel>() {
@Override
public void onResponse(Call<LoginModel> call, Response<LoginModel> response) {
dismissProgressBarDialog();
int model = response.body().getResult();
Log.i("BODY : ", String.valueOf(model));
if (!response.isSuccessful()) {
Toast.makeText(context, context.getResources().getString(R.string.errorServer), Toast.LENGTH_LONG).show();
return;
}
myTimer = new MyTimer(SECOND_TIME, 1000);
views.reactionActivationPress(model);
}
@Override
public void onFailure(Call<LoginModel> call, Throwable t) {
Log.i(Constant.NETWORK_LOG, "sendCode : " + t.toString());
dismissProgressBarDialog();
Toast.makeText(MyApplication.getContext(), "Server Problem", Toast.LENGTH_LONG).show();
}
});
答案 2 :(得分:3)
ApiClient.getClient().create(ApiService.class).sendCode(phoneNumber).enqueue(new Callback<LoginModel>() {
@Override
public void onResponse(Call<LoginModel> call, Response<LoginModel> response) {
Log.i("BODY : ", String.valueOf(response.body().getResult()));
if (!response.isSuccessful()) {
Toast.makeText(context, context.getResources().getString(R.string.errorServer), Toast.LENGTH_LONG).show();
dismissProgressBarDialog();
return;
}
myTimer = new MyTimer(SECOND_TIME, 1000);
views.reactionActivationPress(response.body().getResult());
}
@Override
public void onFailure(Call<LoginModel> call, Throwable t) {
Log.i(Constant.NETWORK_LOG, "sendCode : " + t.toString());
dismissProgressBarDialog();
Toast.makeText(MyApplication.getContext(), "Server Problem", Toast.LENGTH_LONG).show();
}
});
答案 3 :(得分:2)
尝试将“结果”字段设为公开而非私有。我猜想,这种改型将忽略您的json而不是完全初始化结果字段。删除getter和setter并将结果字段公开。
public class LoginModel {
@SerializedName("result")
public int result;
}
答案 4 :(得分:2)
使用Integer,如果您为空,则意味着您从服务器获得的json具有另一个名称或类型, 用邮递员测试您的api 并检查响应名称并输入
public class LoginModel {
@SerializedName("result")
@Expose
private Integer result;
public void setResult(Integer result){
this.result = result;
}
public Integer getResult(){
return result;
}
}
答案 5 :(得分:0)
我认为您的POJO类中存在问题。 尝试此操作可能会对您有所帮助。
public class LoginModel implements Serializable {
@SerializedName("result")
@Expose
private Integer result;
public Integer getResult() {
return result;
}
public void setResult(Integer result) {
this.result = result;
}
}