Java 如何使用android设备从localhost(Mac)中的服务访问API

Java 如何使用android设备从localhost(Mac)中的服务访问API,java,android,spring-boot,spring-security,retrofit2,Java,Android,Spring Boot,Spring Security,Retrofit2,我正在构建一个android应用程序,它使用我在设备(localhost)上运行的spring boot后端的RESTAPI。android应用程序为此目的使用了改进 但无论是使用android设备还是仿真器,我都无法访问任何api 我尝试了许多不同论坛提供的大多数答案,但仍然找不到任何答案 到目前为止我所尝试的 在模拟器上运行 将基本url更改为具有10.0.2.2:portNo-未给出响应 将emulator设置>代理更改为具有网络的IP地址-在springbok后端服务中提供以下内容- 其

我正在构建一个android应用程序,它使用我在设备(localhost)上运行的spring boot后端的RESTAPI。android应用程序为此目的使用了改进

但无论是使用android设备还是仿真器,我都无法访问任何api

我尝试了许多不同论坛提供的大多数答案,但仍然找不到任何答案

到目前为止我所尝试的

在模拟器上运行

将基本url更改为具有10.0.2.2:portNo-未给出响应

将emulator设置>代理更改为具有网络的IP地址-在springbok后端服务中提供以下内容-

其中,“/gen_204”被谷歌用来检查设备是否在线,在本例中是失败的

与设备连接

尝试为两台设备使用相同的wifi网络和热点,但没有成功

与改装相关的代码使用

public interface AuthApis {

    @POST("login")
    Call<LoginRequest> signInUser(@Body LoginRequest loginRequest);

    @POST("register")
    Call<UserDTO> registerUser(@Body UserDTO dto);

}
公共接口authapi{
@发布(“登录”)
呼叫登录用户(@Body LoginRequest LoginRequest);
@邮政(“登记册”)
调用registerUser(@Body UserDTO dto);
}
公共类注册活动扩展了AppCompatActivity{
私有编辑文本名称;
私人编辑文本电子邮件;
私人编辑文本密码;
私人编辑文本确认通行证;
私人authapi;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u注册);
getSupportActionBar().setTitle(“注册”);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
this.name_et=findviewbyd(R.id.uname);
this.email_et=findviewbyd(R.id.emailET);
this.password\u et=findviewbyd(R.id.passET);
this.confirmpass\u et=findviewbyd(R.id.confirmPassET);
改装改装=新改装.Builder()
.baseUrl(“http://localhost:8080/auth/")
.addConverterFactory(GsonConverterFactory.create())
.build();
authapi=reformation.create(authapi.class);
}
public void signupBtn_onClick(视图){
String name=name_et.getText().toString();
字符串email=email_et.getText().toString();
字符串password=password_et.getText().toString();
字符串confirm_password=confirmpass_et.getText().toString();
UserDTO dto=新的UserDTO();
dto.setUserName(名称);
设置电子邮件(电子邮件);
设置密码(密码);
dto.setConfirmPassword(确认密码);
调用userDTOCall=authapi.registerUser(dto);
userDTOCall.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
如果(!response.issusccessful()){
System.out.println(response.code());
}
System.out.println(response.body());
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
}
});
}
}
上述代码在调试时将在call.enqueue方法之后停止


我想知道可能出了什么问题。非常感谢您的帮助。

关闭防火墙后,我可以让模拟器正常工作。但是,如果您不想关闭防火墙,这个答案也很有效,它将授予10.0.2.2的网络访问权限

并将基本url更改为ip 10.0.2.2

Retrofit retrofit=new Retrofit.Builder()
                .baseUrl("http://10.0.2.2:8080/auth/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

并确保在emulator设置中选中了“使用Android Studio HTTP代理设置”。

说实话,这取决于很多事情,我无法说出确切的问题是什么。但简单的解决方案是,若主机连接到网络,则使用主机外部网络地址,如192.168.x.x。不管怎样,你都可以找到很多关于的信息。我知道这不是确切的回答,但希望有帮助you@MahdiRajabi非常感谢。
public class RegistrationActivity extends AppCompatActivity {
    private EditText name_et;
    private EditText email_et;
    private EditText password_et;
    private EditText confirmpass_et;

    private AuthApis authApis;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_registration);

        getSupportActionBar().setTitle("Registration");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        this.name_et=findViewById(R.id.unameET);
        this.email_et=findViewById(R.id.emailET);
        this.password_et=findViewById(R.id.passET);
        this.confirmpass_et=findViewById(R.id.confirmPassET);

        Retrofit retrofit=new Retrofit.Builder()
                .baseUrl("http://localhost:8080/auth/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        authApis=retrofit.create(AuthApis.class);
    }

    public void signupBtn_onClick(View view) {
        String name = name_et.getText().toString();
        String email = email_et.getText().toString();
        String password = password_et.getText().toString();
        String confirm_password = confirmpass_et.getText().toString();

        UserDTO dto=new UserDTO();
        dto.setUserName(name);
        dto.setEmail(email);
        dto.setPassword(password);
        dto.setConfirmPassword(confirm_password);

        Call<UserDTO> userDTOCall=authApis.registerUser(dto);

        userDTOCall.enqueue(new Callback<UserDTO>() {
            @Override
            public void onResponse(Call<UserDTO> call, Response<UserDTO> response) {
                if(!response.isSuccessful()){
                    System.out.println(response.code());
                }

                System.out.println(response.body());
            }

            @Override
            public void onFailure(Call<UserDTO> call, Throwable t) {

            }
        });

    }
}
Retrofit retrofit=new Retrofit.Builder()
                .baseUrl("http://10.0.2.2:8080/auth/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();