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

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

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

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

【问题讨论】:

    标签: php android mysql json


    【解决方案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。

    线程@StackOverFlow 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.htmldeveloper.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 秒才能启动,但一旦连接运行速度非常快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-25
        • 1970-01-01
        • 2016-02-22
        • 1970-01-01
        • 2018-03-27
        • 1970-01-01
        • 1970-01-01
        • 2020-03-09
        相关资源
        最近更新 更多