如何使用 android 设备从本地主机 (Mac) 中的服务访问 API

How to access apis from service in localhost (Mac) using android device

我正在构建一个 android 应用程序,它使用 spring 启动后端的 REST apis,我在我的设备(本地主机)上 运行。 android 应用程序为此目的使用改造。

但我无法使用我的 android 设备和模拟器来击中任何 api。

我已经尝试了很多不同论坛提供的大部分答案,但仍然找不到任何答案。

到目前为止我尝试了什么;

运行 在模拟器上

将基础 url 更改为 10.0.2.2:portNo- 没有响应

更改模拟器设置> 代理以获取网络的 IP 地址-在 springbok 后端服务中提供以下内容-source

Request received for GET '/gen_204':

org.apache.catalina.connector.RequestFacade@19ebbc48

servletPath:/gen_204
pathInfo:null
headers: 
user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.32 Safari/537.36
host: www.google.com
connection: Keep-Alive
accept-encoding: gzip


Security filter chain: [
  WebAsyncManagerIntegrationFilter
  SecurityContextPersistenceFilter
  HeaderWriterFilter
  CorsFilter
  LogoutFilter
  JWTAuthenticationFilter
  RequestCacheAwareFilter
  SecurityContextHolderAwareRequestFilter
  AnonymousAuthenticationFilter
  SessionManagementFilter
  ExceptionTranslationFilter
  FilterSecurityInterceptor
]


************************************************************


2020-03-12 15:45:21.473 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /gen_204 at position 1 of 12 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
2020-03-12 15:45:21.474 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /gen_204 at position 2 of 12 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'
2020-03-12 15:45:21.474 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /gen_204 at position 3 of 12 in additional filter chain; firing Filter: 'HeaderWriterFilter'
2020-03-12 15:45:21.475 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /gen_204 at position 4 of 12 in additional filter chain; firing Filter: 'CorsFilter'
2020-03-12 15:45:21.477 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /gen_204 at position 5 of 12 in additional filter chain; firing Filter: 'LogoutFilter'
2020-03-12 15:45:21.477 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /gen_204 at position 6 of 12 in additional filter chain; firing Filter: 'JWTAuthenticationFilter'
2020-03-12 15:45:21.477 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /gen_204 at position 7 of 12 in additional filter chain; firing Filter: 'RequestCacheAwareFilter'
2020-03-12 15:45:21.477 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /gen_204 at position 8 of 12 in additional filter chain; firing Filter: 'SecurityContextHolderAwareRequestFilter'
2020-03-12 15:45:21.477 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /gen_204 at position 9 of 12 in additional filter chain; firing Filter: 'AnonymousAuthenticationFilter'
2020-03-12 15:45:21.477 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /gen_204 at position 10 of 12 in additional filter chain; firing Filter: 'SessionManagementFilter'
2020-03-12 15:45:21.477 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /gen_204 at position 11 of 12 in additional filter chain; firing Filter: 'ExceptionTranslationFilter'
2020-03-12 15:45:21.477 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /gen_204 at position 12 of 12 in additional filter chain; firing Filter: 'FilterSecurityInterceptor'
2020-03-12 15:45:21.477  INFO 36507 --- [nio-8080-exec-7] l.a.e.o.A.JwtAuthenticationEntryPoint    : Unauthorized error. Message - Full authentication is required to access this resource
2020-03-12 15:45:21.478  INFO 36507 --- [nio-8080-exec-7] Spring Security Debugger                 : 

************************************************************

Request received for GET '/error':

org.apache.catalina.core.ApplicationHttpRequest@78d558cf

servletPath:/error
pathInfo:null
headers: 
user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.32 Safari/537.36
host: www.google.com
connection: Keep-Alive
accept-encoding: gzip


Security filter chain: [
  WebAsyncManagerIntegrationFilter
  SecurityContextPersistenceFilter
  HeaderWriterFilter
  CorsFilter
  LogoutFilter
  JWTAuthenticationFilter
  RequestCacheAwareFilter
  SecurityContextHolderAwareRequestFilter
  AnonymousAuthenticationFilter
  SessionManagementFilter
  ExceptionTranslationFilter
  FilterSecurityInterceptor
]


************************************************************


2020-03-12 15:45:21.478 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /error at position 1 of 12 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
2020-03-12 15:45:21.478 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /error at position 2 of 12 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'
2020-03-12 15:45:21.478 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /error at position 3 of 12 in additional filter chain; firing Filter: 'HeaderWriterFilter'
2020-03-12 15:45:21.478 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /error at position 4 of 12 in additional filter chain; firing Filter: 'CorsFilter'
2020-03-12 15:45:21.478 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /error at position 5 of 12 in additional filter chain; firing Filter: 'LogoutFilter'
2020-03-12 15:45:21.478 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /error at position 6 of 12 in additional filter chain; firing Filter: 'JWTAuthenticationFilter'
2020-03-12 15:45:21.478 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /error at position 7 of 12 in additional filter chain; firing Filter: 'RequestCacheAwareFilter'
2020-03-12 15:45:21.478 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /error at position 8 of 12 in additional filter chain; firing Filter: 'SecurityContextHolderAwareRequestFilter'
2020-03-12 15:45:21.478 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /error at position 9 of 12 in additional filter chain; firing Filter: 'AnonymousAuthenticationFilter'
2020-03-12 15:45:21.478 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /error at position 10 of 12 in additional filter chain; firing Filter: 'SessionManagementFilter'
2020-03-12 15:45:21.478 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /error at position 11 of 12 in additional filter chain; firing Filter: 'ExceptionTranslationFilter'
2020-03-12 15:45:21.480 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /error at position 12 of 12 in additional filter chain; firing Filter: 'FilterSecurityInterceptor'
2020-03-12 15:45:21.480 DEBUG 36507 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : /error reached end of additional filter chain; proceeding with original chain

其中 google 使用“/gen_204”来检查设备是否在线,在本例中失败。

正在连接设备

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

与改造相关的代码使用;

public interface AuthApis {

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

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

}
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) {

            }
        });

    }
}

以上代码,调试时,会在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();

并确保在模拟器设置中选中 'Use Android Studio HTTP proxy settings'。