改造 onFailure() 在连接到本地主机时不断触发
retrofit onFailure() keeps triggering on connecting to localhost
我想连接到我的本地主机服务器来测试我的应用程序。出于这个原因,我正在使用 retrofit
库。这是我的接口 class,它定义 url 连接到:
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
public interface PostInterface {
String JSONURL = "http://80.0.0.13/";
@FormUrlEncoded
@POST("login_screen/backend.php")
Call<String> getUserLogin(
@Field("input") String input,
@Field("username") String uname,
@Field("password") String password
);
}
我在 java 代码中调用此接口:
Call<String> call = null;
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(PostInterface.JSONURL)
.addConverterFactory(ScalarsConverterFactory.create())
.build();
PostInterface api = retrofit.create(PostInterface.class);
call = api.getUserLogin("sign in", "abc", "abc@xyz");
if (call != null) {
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.body() != null) {
Log.d("success",response.body());
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), t.toString(), Snackbar.LENGTH_SHORT);
snackbar.show();
}
});
}
奇怪的是,onFailure()
方法每次都会触发以下 throwable:
javaSocketTimeoutException: Failed to connect to /80.0.0.13 (port 80)....
但是当我在 android 浏览器或 PC 浏览器中尝试 url 时,它工作正常。
我检查过的东西:
- 该项目存储在
C:\xampp\htdocs
中,与我的实时服务器位置具有完全相同的层次结构。
Apache
和 SQL
端口都在我的 xampp
控制面板中打开。
- 我的本地主机端口号是默认的80
- 当我 运行 我的模拟器中的应用程序使用此 ip
http://10.0.2.2:80/
时,它工作正常
为什么应用无法连接到我的本地服务器?
编辑:我可以使用我的电脑 IP 地址从我的 phone 浏览器访问我的网站,但是当我想从应用程序访问它时,然后 onFailure()
触发器
这是因为 localhost
不是 android 的有效 URL。
localhost
是环回地址,表示网络请求将由当前设备由某个应用程序(PHP服务器)处理。
因此,当您在计算机上输入 localhost
(PC/laptop) 时,它将检查在指定端口(在您的情况下为 80)侦听的服务器应用程序,并将该请求转发到服务器应用。在您的情况下,它是 XAMPP 正在侦听端口 80
.
但是,当您转到 Android 应用程序时,android 设备或模拟器 上没有服务器应用程序 运行,因为它们是不同的设备。因此,您在 Android.
上收到 localhost 的 404 错误
要解决此问题,只需获取您 PC 的 IP 地址(使用 ipconfig
命令)并使用该地址代替本地主机。
例如:如果 IP 地址是 192.168.0.129
,那么您的 URL 将是 http://192.168.0.129:80/
经过一番折腾,终于从github中的一个post找到了解决办法:
- 在您的手机中打开 USB 网络共享和 USB 调试模式。
- 通过 USB 将您的手机连接到 laptop/desktop。
- 现在只需更改 ip 地址(运行 cmd 中的“ipconfig”)
我想连接到我的本地主机服务器来测试我的应用程序。出于这个原因,我正在使用 retrofit
库。这是我的接口 class,它定义 url 连接到:
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
public interface PostInterface {
String JSONURL = "http://80.0.0.13/";
@FormUrlEncoded
@POST("login_screen/backend.php")
Call<String> getUserLogin(
@Field("input") String input,
@Field("username") String uname,
@Field("password") String password
);
}
我在 java 代码中调用此接口:
Call<String> call = null;
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(PostInterface.JSONURL)
.addConverterFactory(ScalarsConverterFactory.create())
.build();
PostInterface api = retrofit.create(PostInterface.class);
call = api.getUserLogin("sign in", "abc", "abc@xyz");
if (call != null) {
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.body() != null) {
Log.d("success",response.body());
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), t.toString(), Snackbar.LENGTH_SHORT);
snackbar.show();
}
});
}
奇怪的是,onFailure()
方法每次都会触发以下 throwable:
javaSocketTimeoutException: Failed to connect to /80.0.0.13 (port 80)....
但是当我在 android 浏览器或 PC 浏览器中尝试 url 时,它工作正常。
我检查过的东西:
- 该项目存储在
C:\xampp\htdocs
中,与我的实时服务器位置具有完全相同的层次结构。 Apache
和SQL
端口都在我的xampp
控制面板中打开。- 我的本地主机端口号是默认的80
- 当我 运行 我的模拟器中的应用程序使用此 ip
http://10.0.2.2:80/
时,它工作正常
为什么应用无法连接到我的本地服务器?
编辑:我可以使用我的电脑 IP 地址从我的 phone 浏览器访问我的网站,但是当我想从应用程序访问它时,然后 onFailure()
触发器
这是因为 localhost
不是 android 的有效 URL。
localhost
是环回地址,表示网络请求将由当前设备由某个应用程序(PHP服务器)处理。
因此,当您在计算机上输入 localhost
(PC/laptop) 时,它将检查在指定端口(在您的情况下为 80)侦听的服务器应用程序,并将该请求转发到服务器应用。在您的情况下,它是 XAMPP 正在侦听端口 80
.
但是,当您转到 Android 应用程序时,android 设备或模拟器 上没有服务器应用程序 运行,因为它们是不同的设备。因此,您在 Android.
上收到 localhost 的 404 错误要解决此问题,只需获取您 PC 的 IP 地址(使用 ipconfig
命令)并使用该地址代替本地主机。
例如:如果 IP 地址是 192.168.0.129
,那么您的 URL 将是 http://192.168.0.129:80/
经过一番折腾,终于从github中的一个post找到了解决办法:
- 在您的手机中打开 USB 网络共享和 USB 调试模式。
- 通过 USB 将您的手机连接到 laptop/desktop。
- 现在只需更改 ip 地址(运行 cmd 中的“ipconfig”)