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

如何从Sails.js数据库服务器向Android应用获取并过滤模型数据?

没问题,我来一步步帮你搞定这个需求——从Android端获取Sails.js服务器模型数据,还得先在服务端做好过滤。咱们分两大块来:先搞定Sails.js这边的接口和过滤逻辑,再处理Android端的请求与数据解析。

第一步:在Sails.js服务器端实现带过滤的API接口

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端实现数据请求与解析

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:27:34