我正在使用Retrofit来调用我的API。我是Retrofit的新手,这就是我无法找到这个错误的原因。我向API发送请求,API响应为200 OK
,但改进调用onFailure
方法。我的API接口如下:
public interface API {
@FormUrlEncoded
@POST("login")
Call<Login> login(@Query("user") String email,@Query("pass") String password, @Field("device key") String deviceKey);
}
我的电话是:
loginCall = MyApplication.getInstance().getAPI().login(username,password,deviceKey);
loginCall.enqueue(new Callback<Login>() {
@Override
public void onResponse(Call<Login> call, Response<Login> response) {
if(response.body() != null)
{
Login login = response.body();
Toast.makeText(LoginActivity.this, response.body().toString(), Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(Call<Login> call, Throwable t) {
Toast.makeText(LoginActivity.this, "Failsssssssss", Toast.LENGTH_LONG).show();
}
});
我的模型类如下:
public class Login {
String status;
String Auth_Token;
public Login(String status, String auth_Token) {
this.status = status;
Auth_Token = auth_Token;
}
}
据我所知,我的模型类存在问题。我的API会返回两个回复:
"{"status":"200","Auth_Token":"jhjsfbah71yb121t312hv"}"
"{"status":"500","Response":"Invalid Cardentials"}"
任何帮助将不胜感激。提前谢谢。
答案 0 :(得分:4)
您的服务器响应存在问题。 Retrofit读取HTTP状态,因此您必须确保从服务器发送它。 Retrofit试图读取一个响应代码200,这个代码可能不可用,因此它正在调用失败方法。
答案 1 :(得分:0)
我有类似的问题。 就我而言,问题是由于将响应转换为JSON格式引起的。 (我得到的回复不是JSON格式) 所以要弄清楚细节,我的ResponseBody有以下几种方式。
Call<ResponseBody> call = client.callTTS(request);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if(response == null)
{
Log.d("MainActivity", "Response is null");
}else
{
Log.d("MainActivity", "Response has contents");
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.d("MainActivity", t.getMessage());
}
});
希望这可以帮助有同样问题的人。
答案 2 :(得分:0)
对于我来说,问题是由我的Api中的print_r($ data)引起的,删除它可以解决我的问题。
旧代码
public function getNewsApi()
{
$data = $this->Db_Model->select_all_data('news');
print_r($data);
$response['result'] = isset($data) ? $data : '';
$response['message'] = 'All data';
$response['status'] = 'true';
$response['code'] = '200';
echo json_encode($response);
}
新代码
public function getNewsApi()
{
$data = $this->Db_Model->select_all_data('news');
$response['result'] = isset($data) ? $data : '';
$response['message'] = 'All data';
$response['status'] = 'true';
$response['code'] = '200';
echo json_encode($response);
}
希望这也有帮助。
答案 3 :(得分:0)
在onFailure()中使用t.message()可以揭示json到模型类的数据类型不匹配,从而导致此问题。只需通过t.message()对其进行调试,并按照消息中的建议更改数据类型,即可解决问题。