如何从Android应用程序中的Web服务器获取数据?

时间:2013-05-14 14:05:54

标签: android

我想从Android应用程序中的Web服务器检索数据,并且不知道从哪里开始。我应该使用网络服务吗?

3 个答案:

答案 0 :(得分:24)

我会推荐这些教程:

Connect android with PHP and MySqlJSON in androidPHP and MySQLi

我使用了这些教程,并设法在没有太多困难的情况下获得您正在尝试的工作。

在它们之间,它们描述了如何在每个阶段,Android应用程序,数据库和Web服务器端执行您所尝试的操作的每个步骤,并包含额外信息,以便您可以执行哪些操作来处理和使用收到的信息

我唯一要补充的是Connect PHP with PHP和MySql教程使用了不推荐使用的php中的mysql_。使用MySqli要好得多,这就是我加入第三个链接的原因。

您想要做的基本概要是:

1)在Android应用程序中使用类似这样的类向服务器php脚本发出请求:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class JSONParser {

    // Response from the HTTP Request
    static InputStream httpResponseStream = null;
    // JSON Response String to create JSON Object
    static String jsonString = "";

    // Method to issue HTTP request, parse JSON result and return JSON Object
    public JSONObject makeHttpRequest(String url, String method,
            List<NameValuePair> params) {

        try {
            // get a Http client
            DefaultHttpClient httpClient = new DefaultHttpClient();

            // If required HTTP method is POST
            if (method == "POST") {
                // Create a Http POST object
                HttpPost httpPost = new HttpPost(url);
                // Encode the passed parameters into the Http request
                httpPost.setEntity(new UrlEncodedFormEntity(params));
                // Execute the request and fetch Http response
                HttpResponse httpResponse = httpClient.execute(httpPost);
                // Extract the result from the response
                HttpEntity httpEntity = httpResponse.getEntity();
                // Open the result as an input stream for parsing
                httpResponseStream = httpEntity.getContent();
            }
            // Else if it is GET
            else if (method == "GET") {
                // Format the parameters correctly for HTTP transmission
                String paramString = URLEncodedUtils.format(params, "utf-8");
                // Add parameters to url in GET format
                url += "?" + paramString;
                // Execute the request
                HttpGet httpGet = new HttpGet(url);
                // Execute the request and fetch Http response
                HttpResponse httpResponse = httpClient.execute(httpGet);
                // Extract the result from the response
                HttpEntity httpEntity = httpResponse.getEntity();
                // Open the result as an input stream for parsing
                httpResponseStream = httpEntity.getContent();
            }
            // Catch Possible Exceptions
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            // Create buffered reader for the httpResponceStream
            BufferedReader httpResponseReader = new BufferedReader(
                    new InputStreamReader(httpResponseStream, "iso-8859-1"), 8);
            // String to hold current line from httpResponseReader
            String line = null;
            // Clear jsonString
            jsonString = "";
            // While there is still more response to read
            while ((line = httpResponseReader.readLine()) != null) {
                // Add line to jsonString
                jsonString += (line + "\n");
            }
            // Close Response Stream
            httpResponseStream.close();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        try {
            // Create jsonObject from the jsonString and return it
            return new JSONObject(jsonString);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
            // Return null if in error
            return null;
        }
    }
}

处理通信,打开连接并接收JSON字符串,然后将其处理为JSON对象。

2)在php服务器中,打开一个mysqli连接到你的SQL数据库,运行一个mysqli-&gt; query()并执行以下结果:

if (mysqli_num_rows($result) > 0) {
        // looping through all results
        $response["apps"] = array();

        while ($row = mysqli_fetch_array($result)) {

            $apps = array();

            $apps["name"] = $row["name"];
            $apps["package"] = $row["package"];
            $apps["version"] = $row["version"];
            $apps["dateversion"] = $row["dateversion"];
            $apps["sdkver"] = $row["sdkver"];
            $apps["pathroot"] = $row["pathroot"];
            $apps["rootname"] = $row["rootname"];
            $apps["apkmd5"] = $row["apkmd5"];
            $apps["extraapkmd5"] = $row["extraapkmd5"];
            $apps["instructionsmd5"] = $row["instructionsmd5"];
            $apps["assetsmd5"] = $row["assetsmd5"];
            $apps["root"] = $row["root"];
            $apps["current"] = $row["current"];

            // push single product into final response array
            array_push($response["apps"], $apps);
        }
        // success
        $response["success"] = 1;

        // echoing JSON response
        echo json_encode($response);

这会迭代数据库响应并将其编码为JSON字符串,然后发送回Android应用程序,然后可以处理它。

如何创建这样的内容在链接的教程中进行了解释

答案 1 :(得分:1)

首先,您必须在要使用的网络服务之间进行选择 然后找出最符合您需求的类型 根据我的说法,解析json,xml或soap的最简单的方法是跟随(使用教程链接):
     Json :Jackson frame work
     xml :Simple framework
     soap :ksoap2 framework

答案 2 :(得分:0)

这不会直接回答您的问题,但由于您已经问过从哪里开始,您应该通过在AsyncTask中构建Web请求来正确启动。这将允许您在单独的线程中发出请求,并在UI上设置数据。

AsyncTasks使用线程池和工作队列也可以轻松更新用户的进度。这里有一些很好的例子:AsyncTask Android example