改造 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 时,它工作正常。

我检查过的东西:

  1. 该项目存储在 C:\xampp\htdocs 中,与我的实时服务器位置具有完全相同的层次结构。
  2. ApacheSQL 端口都在我的 xampp 控制面板中打开。
  3. 我的本地主机端口号是默认的80
  4. 当我 运行 我的模拟器中的应用程序使用此 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找到了解决办法:

  1. 在您的手机中打开 USB 网络共享和 USB 调试模式。
  2. 通过 USB 将您的手机连接到 laptop/desktop。
  3. 现在只需更改 ip 地址(运行 cmd 中的“ipconfig”)