使用Retrofit2时如何解决“连接失败”错误?

时间:2019-05-09 21:36:16

标签: java android retrofit2

我有一个应用程序,正在使用Retrofit2连接到rest api。每次尝试使用它时,都会出现错误:“连接失败”。我不知道问题是什么。我希望能够连接到其余的api并使用我的GET请求。

public static final String APP_BASE_URL="http://URL.com/";

Retrofit retrofit=new Retrofit.Builder()
    .baseUrl(APP_BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .build();

MyApiendpoint apiService=retrofit.create(MyApiendpoint.class);
Call<Bmwsales> call=apiService.getVehicle(barCode);

call.enqueue( new Callback<Bmwsales>() {

    @Override
    public void onResponse(Call<Bmwsales> call, Response<Bmwsales> response) {
        System.out.println("SUCCESSFULL!!!");
    }

    @Override
    public void onFailure(Call<Bmwsales> call, Throwable t) {
        System.out.println("FAILURE!!!"+t.getMessage());
    }
});

public interface MyApiendpoint {

    @GET("bmwsales/vin/{vin}")
    Call<Bmwsales> getVehicle(
        @Path("vin") String vin
    );
}

我不确定是什么问题。我看过很多例子,但仍然无法弄清楚。

3 个答案:

答案 0 :(得分:0)

您的代码没有问题。

但是我建议您检查并尝试一些事情

首先,请确保您使用的是最新版的Retrofit

implementation 'com.squareup.retrofit2:retrofit:2.5.0'

第二,尝试向Retrofit添加一个拦截器,然后检查日志以查看发送到服务器的实际请求,以及是否可以毫无问题地访问该URL

以下是使用Okhttp的示例

  // Create a new object from HttpLoggingInterceptor
  HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
  interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

  // Add Interceptor to HttpClient
  OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();

  // Init retrofit object
  Retrofit retrofit = new Retrofit.Builder()
           .baseUrl(APP_BASE_URL)
           .addConverterFactory(GsonConverterFactory.create())
           .client(client) // Set HttpClient to be used by Retrofit
           .build();

不要忘记将Okhttp日志拦截器添加到您的依赖项中

 implementation 'com.squareup.okhttp3:logging-interceptor:3.12.1'

第三,也许您的连接速度很慢,您只需要增加超时时间即可!

 OkHttpClient client = new OkHttpClient.Builder()
         .readTimeout(60, TimeUnit.SECONDS)
         .connectTimeout(60, TimeUnit.SECONDS)
         .addInterceptor(interceptor).build();

答案 1 :(得分:0)

http://并表示“连接失败”可能意味着您必须添加一个network_security_config.xml来允许与主机进行明文通信或为API安装有效的SSL证书。 NetworkSecurityPolicy.isCleartextTrafficPermitted()告知当前状态。这是和我的answer类似的documentation。一个人可能不会接听任何电话,因为它可能从未发生过。还要确保该URL在浏览器中正常工作。如果vin代表车辆识别号,我将其称为Call<Vehicle>

答案 2 :(得分:0)

您是否在清单中声明了Internet许可?

<manifest xlmns:android...>
 ...
 <uses-permission android:name="android.permission.INTERNET" />
 <application ...
</manifest>```

EDIT : 
Can check your base URL again please ? you can use fake API endpoint to be sure that the issue is not with your Retrofit configuration, yu can use this endpoint : [JSONPlaceholder][1]


  [1]: https://jsonplaceholder.typicode.com/posts