Java 如何使用android设备从localhost(Mac)中的服务访问API
我正在构建一个android应用程序,它使用我在设备(localhost)上运行的spring boot后端的RESTAPI。android应用程序为此目的使用了改进 但无论是使用android设备还是仿真器,我都无法访问任何api 我尝试了许多不同论坛提供的大多数答案,但仍然找不到任何答案 到目前为止我所尝试的 在模拟器上运行 将基本url更改为具有10.0.2.2:portNo-未给出响应 将emulator设置>代理更改为具有网络的IP地址-在springbok后端服务中提供以下内容- 其中,“/gen_204”被谷歌用来检查设备是否在线,在本例中是失败的 与设备连接 尝试为两台设备使用相同的wifi网络和热点,但没有成功 与改装相关的代码使用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后端服务中提供以下内容- 其
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();