如何向Docker部署的API发送Retrofit2请求?请求失败求助
遇到这个问题我之前也碰过,给你整理几个实际有效的排查方向:
先确认DNS解析是否正常
Postman能正常访问大概率是因为你的开发机hosts文件里已经配置了api.test.local到Docker容器/主机IP的映射,但Android设备并没有这个映射。你可以通过adb shell进入Android终端,执行ping api.test.local,如果返回“unknown host”,那就是DNS解析的问题。
解决办法:要么给Android设备添加hosts映射(需要root权限,或者用一些无需root的hosts修改工具),要么直接用Docker容器的实际IP地址发起请求测试,比如http://192.168.xxx.xxx:端口,如果能通,就坐实了DNS的问题。检查Docker的网络模式配置
如果你的Docker用的是默认的bridge模式,容器的IP是Docker内部网段的,Android设备在局域网里可能无法直接通过主机名访问。可以试试这两个调整:- 切换Docker网络为
host模式(启动容器时加--network host),这样容器会直接使用主机的网络端口,局域网设备就能通过主机IP/主机名访问了(注意避免端口冲突); - 给容器分配固定的局域网IP,确保Android设备和容器在同一网段,然后直接用这个IP访问测试。
- 切换Docker网络为
排查Android的网络权限与安全限制
- 先确认
AndroidManifest.xml里已经添加了网络权限:<uses-permission android:name="android.permission.INTERNET" /> - 如果你用的是HTTP协议(不是HTTPS),Android 9及以上默认会拦截明文流量。需要在
res/xml/network_security_config.xml中添加配置允许该域名的明文访问:
然后在<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">api.test.local</domain> </domain-config> </network-security-config>AndroidManifest.xml的application标签里引用这个配置:android:networkSecurityConfig="@xml/network_security_config"
- 先确认
检查主机的防火墙规则
开发机的防火墙可能允许本地(Postman)访问,但拦截了来自局域网(Android设备)的请求。你可以临时关闭防火墙测试,如果能访问了,就需要在防火墙里添加规则,开放应用对应的端口,允许局域网内的设备访问。确认后端服务的监听地址
有时候容器里的后端服务可能只绑定了127.0.0.1,这样只有容器内部能访问,即使端口映射了,外部也无法连接。你需要检查服务的配置文件,确保监听地址是0.0.0.0,比如:- 如果是Nginx,配置里的
listen要写成listen 0.0.0.0:80; - 如果是Java/Node.js服务,启动时要绑定
0.0.0.0而不是localhost
- 如果是Nginx,配置里的
内容的提问来源于stack exchange,提问作者Alphonse

