如何从Sails.js数据库服务器向Android应用获取并过滤模型数据?
没问题,我来一步步帮你搞定这个需求——从Android端获取Sails.js服务器模型数据,还得先在服务端做好过滤。咱们分两大块来:先搞定Sails.js这边的接口和过滤逻辑,再处理Android端的请求与数据解析。
Sails.js默认给模型提供了基础的CRUD接口,但要实现自定义过滤,最灵活的方式是自定义控制器动作,当然也可以根据需求动态接收Android端传过来的过滤参数。
方式1:固定过滤逻辑(服务器端预设条件)
假设你的数据模型叫User,先在api/controllers/UserController.js里添加一个处理过滤的动作:
// api/controllers/UserController.js module.exports = { getFilteredUsers: async function(req, res) { try { // 这里写你的固定过滤逻辑,比如筛选状态为active、年龄大于18的用户 const filteredData = await User.find({ status: 'active', age: { '>': 18 } }); // 以JSON格式返回过滤后的数据 return res.ok(filteredData); } catch (err) { // 处理服务器内部错误 return res.serverError(err); } } };
然后在config/routes.js里配置对应的路由,让Android端能访问到这个接口:
// config/routes.js module.exports.routes = { // 配置GET请求路由,对应上面的控制器动作 'GET /api/user/filtered': 'UserController.getFilteredUsers' };
方式2:动态过滤(接收Android端传的过滤参数)
如果需要根据Android端的需求动态调整过滤条件,可以从请求的Query参数里获取过滤规则:
// 升级后的控制器动作,支持动态过滤 getFilteredUsers: async function(req, res) { try { // 从请求URL的Query参数里获取Android端传过来的条件 const { status, minAge } = req.query; const filter = {}; // 按需组装过滤条件 if (status) filter.status = status; if (minAge) filter.age = { '>': parseInt(minAge) }; const filteredData = await User.find(filter); return res.ok(filteredData); } catch (err) { return res.serverError(err); } }
这样Android端就可以通过?status=active&minAge=18这类参数,灵活控制过滤规则了。
重要配置:CORS跨域
如果Android端和Sails.js服务器不在同一网络环境下(比如服务器部署在云服务器,Android在本地测试),需要在config/cors.js里配置允许跨域请求:
// config/cors.js module.exports.cors = { origin: '*', // 开发环境可以用通配符,生产环境务必指定具体的Android端域名/IP credentials: true, methods: 'GET, POST, PUT, DELETE, OPTIONS, HEAD' };
注意:生产环境不要用origin: '*',要指定具体的允许来源,避免安全风险。
Android端推荐用Retrofit来处理网络请求,它比原生HttpURLConnection更简洁,还支持自动解析JSON数据。
1. 添加依赖
在你的app/build.gradle(Module级别)里添加Retrofit和Gson转换器的依赖:
dependencies { // Retrofit核心库 implementation 'com.squareup.retrofit2:retrofit:2.9.0' // Gson转换器,自动把JSON转成Java对象 implementation 'com.squareup.retrofit2:converter-gson:2.9.0' }
2. 定义数据模型类
创建一个和Sails.js返回的JSON结构对应的Java类,比如User.java:
public class User { private String id; private String name; private String status; private int age; // 生成getter和setter方法 public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
3. 定义Retrofit接口
创建一个接口来描述请求规则:
import java.util.List; import retrofit2.Call; import retrofit2.GET; import retrofit2.Query; public interface ApiService { // 固定过滤的请求,对应Sails.js的固定过滤接口 @GET("api/user/filtered") Call<List<User>> getFilteredUsers(); // 动态过滤的请求,接收Android端传的参数 @GET("api/user/filtered") Call<List<User>> getFilteredUsersByParams( @Query("status") String status, @Query("minAge") int minAge ); }
4. 发起网络请求
在你的Activity或ViewModel里初始化Retrofit并发起请求:
// 初始化Retrofit,替换成你的服务器IP和端口(Sails.js默认端口是1337) Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://your-server-ip:1337/") .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); // 示例:发起动态过滤请求 Call<List<User>> call = apiService.getFilteredUsersByParams("active", 18); call.enqueue(new Callback<List<User>>() { @Override public void onResponse(Call<List<User>> call, Response<List<User>> response) { if (response.isSuccessful() && response.body() != null) { // 成功获取到过滤后的数据,在这里处理(比如更新UI、存入本地数据库) List<User> filteredUsers = response.body(); // 你的业务逻辑代码... } else { // 处理请求失败(比如服务器返回错误码) } } @Override public void onFailure(Call<List<User>> call, Throwable t) { // 处理网络错误(比如无网络、服务器连接失败) t.printStackTrace(); } });
5. 必要的权限配置
在AndroidManifest.xml里添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
如果你的Android版本是9及以上,默认禁止明文HTTP请求,需要:
- 要么改用HTTPS(生产环境推荐)
- 要么在
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"
内容的提问来源于stack exchange,提问作者imaluris

