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

Android设备通过局域网接入点调用PHP编写的Rest API求助

别着急,咱们一步步来解决这个问题——通过局域网调用PHP写的REST API其实没那么复杂,Retrofit完全能搞定,根本不需要Socket.io(除非你需要实时双向通信,你的场景用REST就够了)。

第一步:先确认基础网络连通性

这是最容易忽略的前提,先把网络通了再说:

  • 确保你的Android设备和PHP服务器连接同一个局域网接入点
  • 在Android设备的浏览器里直接访问PHP API的局域网地址,比如 http://192.168.1.100/api/get-data:
    • 如果能返回正常的JSON/数据,说明网络没问题,直接往下看Retrofit的实现
    • 如果不行,先排查服务器端:
      • 检查PHP服务器的监听地址:不能是127.0.0.1,要改成0.0.0.0或者服务器的局域网IP,这样外部设备才能访问
      • 确认防火墙没有挡住端口(默认80端口一般没问题,自定义端口比如8080要确保开放)
      • 检查Apache/Nginx配置,没有限制局域网IP访问
第二步:Retrofit调用局域网API的完整示例

给你写一个能直接用的基础实现,涵盖依赖、接口定义、请求逻辑:

1. 添加Retrofit依赖

在你的app/build.gradle的dependencies块里加入:

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

(版本可以用最新的,2.9.0是比较稳定的版本,兼容性好)

2. 定义API接口和数据模型

创建一个ApiService接口,对应你的PHP API端点,同时定义接收数据的模型类:

import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Query

// 假设你的PHP API返回用户数据,先定义对应的数据类
data class User(
    val id: Int,
    val name: String,
    val email: String
)

// 定义API接口,对应PHP的接口路径
interface ApiService {
    // 比如你的PHP接口是http://[服务器IP]/api/get-user?id=1
    @GET("api/get-user")
    fun getUser(@Query("id") userId: Int): Call<User>
}

3. 初始化Retrofit并发起请求

在你的Activity或者ViewModel里写调用逻辑(这里以Activity为例):

import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

// 替换成你的PHP服务器的局域网IP,端口如果是默认80可以省略
private const val BASE_URL = "http://192.168.1.100/"

private fun fetchUser() {
    // 初始化Retrofit
    val retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build()

    // 创建API服务实例
    val apiService = retrofit.create(ApiService::class.java)
    // 发起请求
    val call = apiService.getUser(1)

    // 异步请求(不要在主线程做同步请求)
    call.enqueue(object : retrofit2.Callback<User> {
        override fun onResponse(call: Call<User>, response: retrofit2.Response<User>) {
            if (response.isSuccessful) {
                val user = response.body()
                // 这里处理返回的数据,比如显示到UI上
                user?.let {
                    println("获取到用户:${it.name},邮箱:${it.email}")
                }
            } else {
                // 请求成功但返回错误码,比如404、500
                println("请求失败,错误码:${response.code()}")
            }
        }

        override fun onFailure(call: Call<User>, t: Throwable) {
            // 网络请求失败,比如连接超时、服务器不可达
            println("网络错误:${t.message}")
        }
    })
}

4. 配置必要的权限

在AndroidManifest.xml里添加网络权限,并且允许明文HTTP请求(因为局域网一般用HTTP):

<uses-permission android:name="android.permission.INTERNET" />

<application
    ...
    android:usesCleartextTraffic="true">
    <!-- 你的Activity等配置 -->
</application>

提示:如果你的PHP服务器配置了HTTPS,就不需要android:usesCleartextTraffic="true"

第三步:常见问题排查

如果还是调用失败,检查这些细节:

  • 服务器IP是否变化:有些路由器会动态分配IP,最好给PHP服务器设置静态IP,避免每次重启IP变了
  • 端口号是否正确:如果服务器用了非默认端口(比如8080),BASE_URL要写成http://192.168.1.100:8080/
  • PHP API的返回格式:必须是标准JSON,Retrofit的Gson转换器才能解析,如果返回HTML或者非标准JSON,会解析失败
  • 关闭移动数据:有时候设备会优先用移动数据,导致无法访问局域网,测试时可以暂时关掉移动数据
  • 跨域问题:虽然Android的Retrofit一般不受浏览器跨域限制,但可以在PHP API开头加跨域头保险:
    header("Access-Control-Allow-Origin: *");
    header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");
    header("Access-Control-Allow-Headers: Content-Type");
    
关于Socket.io的补充

你提到了Socket.io,但其实你的场景完全不需要它——Socket.io是用于实时双向通信的(比如聊天、实时监控),而REST API是请求响应式的,更适合你这种调用本地服务器接口的场景。除非你需要服务器主动给Android设备推送数据,否则没必要折腾Socket.io。

内容的提问来源于stack exchange,提问作者Muzammil Saeed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:38:12