向PHP API发HTTP请求时,能否获取Android应用ID等信息以验证所有权?
嘿,作为PHP开发者能折腾出这段Android代码已经很棒了!咱们来解决你要获取设备/应用信息和用户IP的需求,分几个部分来说:
解决获取应用/设备信息及用户IP的问题
1. 用户IP:PHP端直接就能拿到,不用改Android代码
用户的IP地址不需要在Android端做任何操作,在你的api.php里通过超全局变量就能直接获取:
// 获取基础IP $user_ip = $_SERVER['REMOTE_ADDR']; // 如果用户使用了代理,尝试获取真实IP if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $user_ip = $_SERVER['HTTP_X_FORWARDED_FOR']; }
把这段代码加到api.php里,就能拿到用户的IP地址了。
2. 应用ID、设备名称:需要在Android端获取后传递
这些信息属于设备/应用本地数据,得在Android代码里先获取到,再通过请求参数或者请求头发给你的API。下面给你两种简单的实现方式:
方式一:把信息作为请求参数传递
直接在你拼接请求参数的代码里添加新字段就行,不用改请求逻辑:
try { data = URLEncoder.encode("block_id", "UTF-8")+ "=" + URLEncoder.encode(adSetupID, "UTF-8"); data += "&" + URLEncoder.encode("banner_size", "UTF-8") + "=" + URLEncoder.encode(adSetupBannerSize, "UTF-8"); // 添加应用ID(就是你的应用包名,比如com.example.vasim.apisample) String appId = getApplicationContext().getPackageName(); data += "&" + URLEncoder.encode("app_id", "UTF-8") + "=" + URLEncoder.encode(appId, "UTF-8"); // 添加设备型号(比如Pixel 7、Mate 50这类) String deviceName = android.os.Build.MODEL; data += "&" + URLEncoder.encode("device_name", "UTF-8") + "=" + URLEncoder.encode(deviceName, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }
这样在PHP的$_REQUEST里就能直接拿到app_id和device_name这两个参数了。
方式二:通过请求头传递(更符合HTTP规范)
如果你不想把这些信息放在URL参数里,可以把它们加到请求的User-Agent头里。需要修改你用到的HTTPDataHandler类的GetHTTPData方法(假设你用的是HttpURLConnection):
public String GetHTTPData(String urlString) { String stream = null; try { URL url = new URL(urlString); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 构建自定义User-Agent,把应用ID和设备信息加进去 String appId = getApplicationContext().getPackageName(); String deviceName = android.os.Build.MODEL; // 格式可以自己定义,比如保留系统默认UA再追加自定义内容 String customUserAgent = System.getProperty("http.agent") + " | AppID:" + appId + " | Device:" + deviceName; conn.setRequestProperty("User-Agent", customUserAgent); // 下面是原本的读取流逻辑,不用改 // ... } catch (Exception e) { e.printStackTrace(); } return stream; }
然后在PHP端通过$_SERVER['HTTP_USER_AGENT']就能拿到这个包含自定义信息的User-Agent字符串,你可以自己拆分出需要的内容。
3. 小提醒
- 上面用到的
getPackageName()和Build.MODEL不需要额外申请权限,直接就能用,不用担心权限问题。 - 如果你用的是OkHttp这类第三方网络库,设置请求头的方式会略有不同,但核心逻辑都是一样的:先获取本地信息,再传递给API。
内容的提问来源于stack exchange,提问作者Kliptu
相关产品推荐
相关产品推荐

