You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android调用Spring Boot构建的REST服务时抛出异常求助

Android调用Spring Boot REST接口异常排查与解决

首先结合你给出的代码和问题描述,我整理了几个最可能导致Android调用失败的原因,以及对应的解决办法,你可以逐一排查:

1. 跨域资源共享(CORS)限制

虽然浏览器能正常访问,但Android应用和Spring Boot服务属于不同的请求源,Spring Boot默认会限制跨域请求(浏览器可能因为同源策略的特殊规则暂时允许,但Android端会严格拦截)。

解决办法:
在你的UsersController类上添加@CrossOrigin注解,允许所有源的请求:

@CrossOrigin(origins = "*", allowedHeaders = "*")
@RestController
@RequestMapping("/users")
public class UsersController {
    // 原有代码保持不变
}

如果需要全局配置所有接口都允许跨域,可以创建一个全局配置类:

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*");
    }
}

2. Android网络权限与明文请求限制

Android系统对网络请求有严格的权限和安全限制,这是很容易忽略的点:

  • 添加网络权限:在AndroidManifest.xml中必须声明网络权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • 允许明文HTTP请求:如果你的Spring Boot服务用的是HTTP而非HTTPS,Android 9.0及以上默认禁止明文请求,需要配置允许:
    1. 在res/xml目录下创建network_security_config.xml:
    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <base-config cleartextTrafficPermitted="true" />
    </network-security-config>
    
    1. 在AndroidManifest.xml的<application>标签中引用这个配置:
    android:networkSecurityConfig="@xml/network_security_config"
    

3. 请求URL错误

这里有两个关键细节容易出错:

  • 模拟器访问本地服务的IP:Android模拟器的localhost指向模拟器自身,不能用来访问电脑上的Spring Boot服务,你需要替换成:
    • Android Studio模拟器:10.0.2.2
    • Genymotion模拟器:10.0.3.2
    • 真机:电脑的局域网IP(比如192.168.1.100)
  • 接口路径完整性:你的Controller有@RequestMapping("/users")注解,所以getName接口的完整路径应该是/SpringBootDemo/users/getName,Android调用时一定要用完整路径,不能省略/users前缀。

4. 主线程网络请求异常

Android严格禁止在主线程中发起网络请求,否则会抛出NetworkOnMainThreadException。

解决办法:必须用异步方式发起请求,比如用OkHttp的异步调用:

OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
        .url("http://10.0.2.2:2020/SpringBootDemo/users/getName")
        .build();

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        e.printStackTrace();
        // 处理请求失败逻辑
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        if (response.isSuccessful()) {
            String result = response.body().string();
            // 注意:更新UI必须切换到主线程
            runOnUiThread(() -> {
                // 在这里处理返回结果,比如显示到TextView
            });
        }
    }
});

5. 数据解析异常(针对/userDetails接口)

如果Android调用的是返回List<UsersModel>的接口,需要确保解析库能正确处理JSON数组。比如用Gson解析:

// 假设已经拿到了接口返回的JSON字符串responseBody
Type userListType = new TypeToken<List<UsersModel>>(){}.getType();
List<UsersModel> users = new Gson().fromJson(responseBody, userListType);

你可以先从检查请求URL和网络权限开始,这两个是最常见的问题。

内容的提问来源于stack exchange,提问作者mangaldas lima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:44:08