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及以上默认禁止明文请求,需要配置允许:
- 在
res/xml目录下创建network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>- 在
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)
- Android Studio模拟器:
- 接口路径完整性:你的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
相关产品推荐
相关产品推荐

