有办法获取!核心是 后端 FastAPI 直接获取请求端 IP,Uniapp 安卓端无需额外操作(IP 由网络请求自动携带),以下是具体实现:
核心原理
用户设备(安卓端)向 FastAPI 后端发送网络请求时,请求头中会携带设备的 IP 信息(经路由器/运营商转发后的公网 IP,或局域网 IP),FastAPI 可通过 Request 对象提取。
实现步骤
1. FastAPI 后端:获取 IP 核心代码
python
from fastapi import FastAPI, Request
app = FastAPI()
# 接口示例:获取请求设备的 IP
@app.get("/get_device_ip")
async def get_device_ip(request: Request):
# 1. 优先从 X-Real-IP 头获取(适用于有反向代理的场景,如 Nginx)
client_ip = request.headers.get("X-Real-IP")
# 2. 若无反向代理,从 remote_addr 获取(直接请求时)
if not client_ip:
client_ip = request.client.host # 格式:"192.168.1.100"(局域网)或公网 IP
# 3. 若部署在反向代理后(如 Nginx),需额外配置(见下方注意事项)
return {
"device_ip": client_ip,
"msg": "IP 获取成功"
}
2. Uniapp 安卓端:发送请求(无需额外处理)
Uniapp 只需正常发送网络请求(uni.request),IP 会随请求自动传递给后端,无需手动携带:
javascript
// Uniapp 安卓端代码
uni.request({
url: "http://你的FastAPI地址/get_device_ip", // 注意:需用公网地址(如服务器域名/公网IP)
method: "GET",
success: (res) => {
console.log("设备 IP:", res.data.device_ip); // 打印后端返回的 IP
},
fail: (err) => {
console.log("请求失败:", err);
}
});
关键注意事项
(1)获取的 IP 类型说明
- 若安卓端和后端在 同一局域网 (如连同一个 WiFi):后端获取的是设备的 局域网 IP (如
192.168.1.105)。 - 若安卓端用 4G/5G 移动网络 ,或后端部署在公网服务器(如阿里云):后端获取的是设备的 公网 IP (如
120.234.xx.xx)。 - 无法获取设备的 内网真实 IP(如手机蜂窝网络的内网 IP),只能获取经路由/运营商转发后的 IP。
(2)部署反向代理(如 Nginx)后的配置
若后端通过 Nginx 反向代理(如公网部署时),request.client.host 会获取到 Nginx 的 IP(而非设备 IP),需在 Nginx 中添加以下配置,传递真实 IP 到 FastAPI:
nginx
# Nginx 配置示例(http 块或 server 块中)
location / {
proxy_pass http://127.0.0.1:8000; # 指向 FastAPI 服务
# 传递真实 IP 到后端
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
(3)Uniapp 跨域问题
若 FastAPI 和 Uniapp 域名/端口不同,需在后端配置跨域,允许 Uniapp 访问:
python
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 开发环境可设为 *,生产环境指定 Uniapp 域名
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
效果验证
- 启动 FastAPI 后端(
uvicorn main:app --host 0.0.0.0 --port 8000)。 - 安卓端(真机或模拟器)运行 Uniapp 代码,发送请求。
- 后端会返回设备的 IP 地址,Uniapp 可接收并使用。
总结
- 无需 Uniapp 端额外处理,IP 由网络请求自动携带。
- 核心是 FastAPI 通过
Request.client.host或请求头X-Real-IP获取。 - 公网部署需配置 Nginx 传递真实 IP,避免反向代理遮挡。
这种方式简单可靠,是 Uniapp + FastAPI 获取设备 IP 的最优方案。要不要我帮你整理一份 完整的前后端可运行代码?