通过 JSON 将数据从 android 发送到服务器

Posted

技术标签:

【中文标题】通过 JSON 将数据从 android 发送到服务器【英文标题】:Send data from android to server via JSON 【发布时间】:2011-09-25 07:26:29 【问题描述】:
    我有 mysql 数据库服务器 我需要通过 JSON 向 MySQL 服务器更新和检索数据

所以,我想知道该怎么做,我对这个示例语句很困惑:

HttpPost httppost = new HttpPost("http://10.0.2.2/city.php");

这意味着我需要编写与 PHP 服务器连接的应用程序 在编写php连接到数据库之前对吗?

【问题讨论】:

【参考方案1】:

要将数据发送到服务器,您可以这样做:

private void sendData(ArrayList<NameValuePair> data)

     // 1) Connect via HTTP. 2) Encode data. 3) Send data.
    try
    
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new      
        HttpPost("http://www.blah.com/AddAccelerationData.php");
        httppost.setEntity(new UrlEncodedFormEntity(data));
        HttpResponse response = httpclient.execute(httppost);
        Log.i("postData", response.getStatusLine().toString());
            //Could do something better with response.
    
    catch(Exception e)
    
        Log.e("log_tag", "Error:  "+e.toString());
      

然后发送让我们说:

private void sendAccelerationData(String userIDArg, String dateArg, String timeArg,
        String timeStamp, String accelX, String accelY, String accelZ)

    fileName = "AddAccelerationData.php";

    //Add data to be send.
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(7);
    nameValuePairs.add(new BasicNameValuePair("userID", userIDArg));
    nameValuePairs.add(new BasicNameValuePair("date",dateArg));
    nameValuePairs.add(new BasicNameValuePair("time",timeArg));
    nameValuePairs.add(new BasicNameValuePair("timeStamp",timeStamp));

    nameValuePairs.add(new BasicNameValuePair("accelX",accelX));
    nameValuePairs.add(new BasicNameValuePair("accelY",accelY));
    nameValuePairs.add(new BasicNameValuePair("accelZ",accelZ));

    this.sendData(nameValuePairs);

那么服务器上的 AddAccelerationData.php 文件是:

<?php
/*
 * What this file does is it:
 * 1) Creates connection to database.
 * 2) Retrieve the data being send.
 * 3) Add the retrieved data to database 'Data'.
 * 4) Close database connection.
 */
require_once '../Connection.php'; //connect to a database/disconnect handler.
require_once '../SendAPI.php'; //deals with sending querys.

$server = new Connection();
$send = new Send();

//Connect to database.
$server->connectDB();

//Retrieve the data.
$userID = $_POST['userID'];
$date = $_POST['date'];
$time = $_POST['time'];

$accelX = $_POST['accelX'];
$accelY = $_POST['accelY'];
$accelZ = $_POST['accelZ'];

//Add data to database 'Data'. //Personal method to query and add to database.
$send->sendAccelerationData($userID, $date, $time, $timeStamp, $accelX, $accelY, $accelZ);


//Disconnect from database.
$server->disconnectDB();
?>

这是我最近使用的一个例子。只是要注意在php文件中。我导入 Connection.php 这只是处理与数据库的连接。因此,只需将其替换为连接到 MYSQL 数据库的代码即可。我还导入了 SendAPI.php(你可以忽略它)这只是我发送数据的类。基本上它包含一些我想使用的查询。比如sendAccelerationData()。基本上类类似于存储过程。

【讨论】:

我得到了 ClientProtocolExcaption 你能帮我弄清楚为什么我得到这个吗?【参考方案2】:

您是否需要通过 JSON 进行更新和检索?如果是这种情况,您可能需要编写一些 Web 服务之类的代码(不一定是 PHP,可能是 Java、C# 等)

看这个帖子,好像不能直接从android访问MySql服务器,所以确实可能需要一些Web开发实现JSON/XML中间层来连接android。

线程@*** Android + MySQL using com.mysql.jdbc.Driver

【讨论】:

【参考方案3】:

由于 Android 应用程序无法直接连接到 MySQL 服务器 你需要写一种“桥梁”。

更新:@see Femi 的评论

嗯,从技术上讲,它可以:http://developer.android.com/reference/javax/sql/package-summary.html

但出于安全原因,恕我直言,桥梁是强制性选择。

一种最流行的方法是使用 http 协议进行发送 和读取数据。

您的city.php 将包含用于连接和查询 数据库:

<?php
$db = mysql_connect(....);
//query...
echo json_encode($data);
?>

Android 应用将通过您的服务器连接并解析 json 输出。

所以是的,你需要编写服务器端部分和客户端部分(Android)

一个非常有用的视频:http://www.google.com/events/io/2010/sessions/developing-RESTful-android-apps.html

以 PHP 作为桥接器和 Android 通过 http 协议的代码示例:

http://www.helloandroid.com/tutorials/connecting-mysql-database

【讨论】:

实际上,并没有说 Android 应用程序不能直接与 MySQL 对话:请参阅 developer.android.com/reference/java/sql/package-summary.html 和 developer.android.com/reference/javax/sql/package-summary.html。 Android 原生支持 JDBC:您需要添加 MySQL JDBC 驱动程序,但您绝对可以做到。现在,桥对安全类型细节很有用,但你绝对可以在 Android 中使用 JDBC。 @Francesco:所以,我明白我必须编写代码来连接到 PHP 服务器,然后它会在稍后连接到数据库。否则,我无法想象如何将数据从 MySQL 服务器获取到我的应用程序。你能不能给我一些细节。谢谢 @Femi,即使任何直接连接到数据库的客户端类型的软件写得很糟糕,恕我直言,你是完全正确的。必须使用 ssl 连接,否则必须放置嗅探器并与 db 一起玩! @Daisy,刚刚在我的回答中添加了一些有用的链接 实施前的最后一个问题,我应该在我的android应用程序包中安装任何库(.jar)吗?【参考方案4】:

您可以使用 JDBC 来实现。我做了一个使用 JDBC 标准 API 与 MYSQL 对话的应用程序。请记住,并非所有连接器都有效,我知道的唯一一个是 mysql-connector-java-3.0.17-ga-bin.jar。

您需要实现一个连接池来加快查询响应时间,因为 JDBC 在建立与服务器的连接时会给 Android 带来一点开销,需要 2 到 3 秒才能启动,但一旦连接运行速度非常快。

【讨论】:

以上是关于通过 JSON 将数据从 android 发送到服务器的主要内容,如果未能解决你的问题,请参考以下文章

通过 AWS SNS 将 JSON 数据负载发送到 FCM

使用 JSON 数据从 Android 向服务器发送数据

从 Android 发送到计算引擎服务器的 JSON 返回 null

从 JSON 到 Android 的右单引号

如何将json从android发送到php?

我如何通过 json 将数据从我的设备发送到我的 php 文件