上一篇
安卓与服务器php
- 行业动态
- 2025-04-24
- 3776
安卓客户端通过HTTP与PHP服务器交互,使用JSON传输数据,Retrofit/Volley处理网络请求, PHP接收并响应,(boxed{})
安卓与PHP服务器通信基础
HTTP请求方式
请求类型 | 适用场景 | 特点 |
---|---|---|
GET | 获取数据 | 参数拼接在URL中,长度受限(约2KB) |
POST | 提交数据 | 参数放在请求体中,支持大数据量 |
网络请求工具
- 安卓端:
OkHttp
、Retrofit
、Volley
- PHP端:通过
$_GET
、$_POST
接收参数,使用curl
或file_get_contents()
发起请求
数据交换格式
JSON vs XML
特性 | JSON | XML |
---|---|---|
复杂度 | 低(键值对) | 高(标签嵌套) |
可读性 | 较差 | 较好 |
数据类型支持 | 基础类型+数组+对象 | 需自定义解析规则 |
传输效率 | 高(体积小) | 低(冗余标签) |
安卓解析JSON示例
// 使用Gson解析JSON Gson gson = new Gson(); MyObject obj = gson.fromJson(jsonString, MyObject.class);
PHP生成JSON示例
// 生成JSON响应 header('Content-Type: application/json'); echo json_encode(['status' => 'success', 'data' => $result]);
实现步骤
安卓端请求流程
- 配置网络权限:
<uses-permission android:name="android.permission.INTERNET" />
- 创建请求(以OkHttp为例):
OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://example.com/api.php") .post(RequestBody.create(JSON, jsonData)) .build();
- 异步处理回调:
client.newCall(request).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { // 处理响应 } @Override public void onFailure(Call call, IOException e) { // 处理失败 } });
PHP端接收与响应
// 接收POST数据 $input = json_decode(file_get_contents('php://input'), true); // 业务逻辑处理 $result = processData($input); // 返回JSON header('Content-Type: application/json'); echo json_encode($result);
安全措施
风险点 | 解决方案 |
---|---|
数据传输被改动 | 使用HTTPS,配合SSL证书 |
SQL注入攻击 | PHP端使用PDO预处理语句:$stmt = $pdo->prepare("SELECT FROM users WHERE id=?"); |
敏感信息泄露 | 安卓端避免硬编码API密钥,使用ProGuard混淆代码 |
跨站脚本攻击(XSS) | PHP端对输出内容做HTML实体编码:htmlspecialchars($user_input, ENT_QUOTES) |
常见问题与解决方案
网络权限未配置
- 现象:安卓应用崩溃,日志提示
NetworkOnMainThreadException
- 解决:在
AndroidManifest.xml
添加<uses-permission android:name="android.permission.INTERNET" />
JSON解析异常
- 原因:字段名不匹配/数据类型错误
- 解决:
- 安卓端使用
Gson
时,确保Java类字段与JSON键名一致 - PHP端严格遵循JSON格式,避免多余空格或注释
- 安卓端使用
相关问题与解答
Q1:如何测试安卓与PHP接口的连通性?
A:
- 使用Postman模拟客户端请求,验证PHP接口是否正常响应
- 在安卓端Logcat中观察请求状态码(200为成功)
- 检查服务器Nginx/Apache日志,确认收到请求
Q2:如何实现安卓与PHP的文件上传?
A:
- 安卓端:使用
MultipartBody
构建请求MultipartBody body = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("file", "test.jpg", fileRequestBody) .build();
- PHP端:通过
$_FILES
接收文件$targetPath = 'uploads/'.basename($_FILES['file']['name']); move_uploaded_file($_FILES['file']['tmp_name'], $targetPath);