改造始终呼吁故障甚至响应是200

时间:2017-05-05 15:51:13

标签: android retrofit2

我正在使用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"}"

任何帮助将不胜感激。提前谢谢。

4 个答案:

答案 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()对其进行调试,并按照消息中的建议更改数据类型,即可解决问题。