改造调用总是转到 onFailure
Retrofit call always goes to onFailure
我正在尝试从后端服务获取信息,并且我正在使用 Retrofit 来获取响应。
这是我的改造单例 class,我使用了一个随机的 api 作为示例。我在启动服务时使用自己的。
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class BaseRetrofit {
private static Retrofit retrofitInstance = null;
private BaseRetrofit() {};
public static Retrofit getRetrofitInstance() {
if (retrofitInstance == null) {
retrofitInstance = new Retrofit.Builder()
.baseUrl("http://192.168.1.155:5000")
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofitInstance;
}
}
在我的主要 class 中,我初始化改造并进行调用。
EndPoints myEndPoints = BaseRetrofit.getRetrofitInstance().create(EndPoints.class);
Call<List<JobItem>> jobs = myEndPoints.getJobs();
jobs.enqueue(new Callback<List<JobItem>>() {
@Override
public void onResponse(Call<List<JobItem>> call, Response<List<JobItem>> response) {
Log.d("SUCCESS", "LOADED JSON " + response.body().get(0).getJobType());
}
@Override
public void onFailure(Call<List<JobItem>> call, Throwable t) {
Log.d("ERROR", "ERROR LOADING JSON");
}
});
这是我的 EndPoints 界面。
import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;
public interface EndPoints {
@GET("/getjobs/hardware")
Call<List<JobItem>> getJobs();
}
后台服务启动后需要的URL是http://my_ip_address:5000/getjobs/hardware例如http://192.168.1.155:5000/getjobs/hardware就是这个JSON 是
[
{
"date": "2021-05-22T23:45:27.8696343+02:00",
"host": "172.217.169.164",
"count": 3,
"packetSize": 100,
"jobPeriod": 120,
"jobType": "PING"
}
]
我不明白为什么调用总是转到 onFailure
如果应用程序调用的服务是 运行 在您的本地计算机(或本地主机或 127.0.0.1)上,那么如果您使用的是模拟器,则需要使用 10.0.2.2 作为 IP 地址调用它。所以你的 URL 看起来像 http://10.0.2.2:5000
此外,由于协议是 http,您需要在清单中添加允许明文。为此,最好的方法是在您的 res 目录中创建一个 xml 目录并添加一个 network-security-config.xml 文件,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">10.0.2.2</domain>
</domain-config>
</network-security-config>
然后,将其添加到您的清单中,如下所示:
<application
....
android:networkSecurityConfig="@xml/network_security_config">
.....
.....
</application>
同时尝试打印出可抛出的异常,以了解错误是否再次发生。
编码愉快!
Hanumanjetlibrary.
在 GitHub 上使用此库
在 build.gradle 文件中添加实现 'com.squareup.retrofit2:retrofit:2.6.1'
用于声明 Call stringCall .
api service = RetrofitClient.getStringClient("http:/xyz.com/").create(api.class);
Call<String> stringCall = service.placeorder("8","1");
RetroApiAnyCall.ApiStringCallRetro(stringCall, new RetroApiAnyCall.RetroCallbackApi() {
@Override
public void onSuccess(String result) {
//do stuff here
}
@Override
public void onError(String result) {
//do stuff here
}
});
public界面api{
@FormUrlEncoded
@POST("Api/details.php")
Call<String> placeorder( @Field("class_id") String id, @Field("sec_id") String secid );
}
我正在尝试从后端服务获取信息,并且我正在使用 Retrofit 来获取响应。
这是我的改造单例 class,我使用了一个随机的 api 作为示例。我在启动服务时使用自己的。
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class BaseRetrofit {
private static Retrofit retrofitInstance = null;
private BaseRetrofit() {};
public static Retrofit getRetrofitInstance() {
if (retrofitInstance == null) {
retrofitInstance = new Retrofit.Builder()
.baseUrl("http://192.168.1.155:5000")
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofitInstance;
}
}
在我的主要 class 中,我初始化改造并进行调用。
EndPoints myEndPoints = BaseRetrofit.getRetrofitInstance().create(EndPoints.class);
Call<List<JobItem>> jobs = myEndPoints.getJobs();
jobs.enqueue(new Callback<List<JobItem>>() {
@Override
public void onResponse(Call<List<JobItem>> call, Response<List<JobItem>> response) {
Log.d("SUCCESS", "LOADED JSON " + response.body().get(0).getJobType());
}
@Override
public void onFailure(Call<List<JobItem>> call, Throwable t) {
Log.d("ERROR", "ERROR LOADING JSON");
}
});
这是我的 EndPoints 界面。
import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;
public interface EndPoints {
@GET("/getjobs/hardware")
Call<List<JobItem>> getJobs();
}
后台服务启动后需要的URL是http://my_ip_address:5000/getjobs/hardware例如http://192.168.1.155:5000/getjobs/hardware就是这个JSON 是
[
{
"date": "2021-05-22T23:45:27.8696343+02:00",
"host": "172.217.169.164",
"count": 3,
"packetSize": 100,
"jobPeriod": 120,
"jobType": "PING"
}
]
我不明白为什么调用总是转到 onFailure
如果应用程序调用的服务是 运行 在您的本地计算机(或本地主机或 127.0.0.1)上,那么如果您使用的是模拟器,则需要使用 10.0.2.2 作为 IP 地址调用它。所以你的 URL 看起来像 http://10.0.2.2:5000
此外,由于协议是 http,您需要在清单中添加允许明文。为此,最好的方法是在您的 res 目录中创建一个 xml 目录并添加一个 network-security-config.xml 文件,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">10.0.2.2</domain>
</domain-config>
</network-security-config>
然后,将其添加到您的清单中,如下所示:
<application
....
android:networkSecurityConfig="@xml/network_security_config">
.....
.....
</application>
同时尝试打印出可抛出的异常,以了解错误是否再次发生。
编码愉快!
Hanumanjetlibrary.
在 GitHub 上使用此库 在 build.gradle 文件中添加实现 'com.squareup.retrofit2:retrofit:2.6.1' 用于声明 Call stringCall .
api service = RetrofitClient.getStringClient("http:/xyz.com/").create(api.class);
Call<String> stringCall = service.placeorder("8","1");
RetroApiAnyCall.ApiStringCallRetro(stringCall, new RetroApiAnyCall.RetroCallbackApi() {
@Override
public void onSuccess(String result) {
//do stuff here
}
@Override
public void onError(String result) {
//do stuff here
}
});
public界面api{
@FormUrlEncoded
@POST("Api/details.php")
Call<String> placeorder( @Field("class_id") String id, @Field("sec_id") String secid );
}