我有一个应用程序,正在使用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
);
}
我不确定是什么问题。我看过很多例子,但仍然无法弄清楚。
答案 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