从自己的网站获取数据的简介或教程?

时间:2011-12-13 20:06:56

标签: android

我需要在我的Android应用程序中实现一个模块,该模块从我自己的网站获取一些文本内容(不在浏览器上显示,但由应用程序处理)。

该文本内容将存储在数据库中(MySQL?)。

我唯一的问题是我之前从未做过这样的事情(虽然我熟悉基本的SQL),所以我不确定什么是一个很好的有条理的方法来解决这个问题,我甚至都不知道从哪里开始。

我应该从头开始创建MySQL数据库并开始围绕它编写PHP吗?

是否有一个框架或包装器已经面向与Android应用程序通信,让我专注于我需求的特性?

您认为什么是一个好的起点?

4 个答案:

答案 0 :(得分:6)

首先,您必须为您的应用程序开发联系点(WebService,REST服务或任何适合您的需求)。就我而言,我正在使用生成JSON响应的PHP脚本。

这是一个简单的PHP脚本,它连接到数据库并输出JSON(json_encode method)响应:

<?php
$link = mysqli_connect("localhost", "dbuser", "dbpassword", "database");

$response = array();

$pass = mysqli_query("select * from table");

while($data = mysqli_fetch_object($pass))
{
    array_push($response, array(
        "my_field"  =>  $data->my_field
    ));
}

echo json_encode($response);

mysqli_close($link);

&GT;

该脚本将输出如下的JSON响应:

[{"my_field":1}]

当您的应用程序通过HTTP POST或GET响应请求数据时,您将使用库解析答案。由于我在PHP方面使用JSON,我目前正在为我的项目使用GSON

要从Android应用程序请求JSON数据,您可以使用我带到某处的RestClass(不记得了),但这里是代码:

public class RestClient
{
    private ArrayList <NameValuePair> params;
    private ArrayList <NameValuePair> headers;
    private String url;
    private int responseCode;
    private String message;
    private String response;    

public enum RequestMethod
{
        GET,
        POST
}

public String getResponse() {
    return response;
}

public String getErrorMessage() {
    return message;
}

public int getResponseCode() {
    return responseCode;
}

public RestClient(String url)
{
    this.url    = url;
    params      = new ArrayList<NameValuePair>();
    headers         = new ArrayList<NameValuePair>();  
}

// ------------------------------------------------------------------------------- 
// Various methods.
// -------------------------------------------------------------------------------
/**
 * Add a parameter to the request (pair, name/value).
 * @param name  Name of the parameter (ex: &name=)
 * @param value Value of the parameter (ex: &name=value).
 */
public void AddParam(String name, String value)
{
    params.add(new BasicNameValuePair(name, value));
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

/**
 * Add a header to the request (if needed).
 * @param name  Name of the header. (ex: Content-Type)
 * @param value Value of the header. (ex: Content-Type = text/html).
 */
public void AddHeader(String name, String value)
{
    headers.add(new BasicNameValuePair(name, value));
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/**
 * Fetch the HTTP content via POST or GET.
 * @param method            Method to be used.
 * @throws Exception        Exception to be catched in case of a network problem.
 */
public void Execute(RequestMethod method) throws Exception
{
    switch(method) {
        case GET:
        {
            //add parameters
            String combinedParams = "";
            if(!params.isEmpty()){
                combinedParams += "?";
                for(NameValuePair p : params)
                {
                    String paramString = p.getName() + "=" + URLEncoder.encode(p.getValue(),"UTF-8");
                    if(combinedParams.length() > 1)
                    {
                        combinedParams  +=  "&" + paramString;
                    }
                    else
                    {
                        combinedParams += paramString;
                    }
                }
            }

            HttpGet request = new HttpGet(url + combinedParams);

            //add headers
            for(NameValuePair h : headers)
            {
                request.addHeader(h.getName(), h.getValue());
            }

            executeRequest(request, url);
            break;
        }
        case POST:
        {
            HttpPost request = new HttpPost(url);

            //add headers
            for(NameValuePair h : headers)
            {
                request.addHeader(h.getName(), h.getValue());
            }

            if(!params.isEmpty()){
                request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
            }

            executeRequest(request, url);
            break;
        }
    }
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/**
 * Alternative method to execute the HTTP request.
 * @param request   The HTTP request object to be used.
 * @param url       HTTP url.
 */
private void executeRequest(HttpUriRequest request, String url)
{
    HttpClient client = new DefaultHttpClient();

    HttpResponse httpResponse;

    try {
        httpResponse = client.execute(request);
        responseCode = httpResponse.getStatusLine().getStatusCode();
        message = httpResponse.getStatusLine().getReasonPhrase();

        HttpEntity entity = httpResponse.getEntity();

        if (entity != null) {

            InputStream instream = entity.getContent();
            response = convertStreamToString(instream);

            // Closing the input stream will trigger connection release
            instream.close();
        }

    } catch (ClientProtocolException e)  {
        client.getConnectionManager().shutdown();
        e.printStackTrace();
    } catch (IOException e) {
        client.getConnectionManager().shutdown();
        e.printStackTrace();
    }
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/**
 * Private method. Convert an HTTP stream to a string stream.
 * @param is        InputStream to be converted.
 * @return      String to be used.
 */
private static String convertStreamToString(InputStream is) {

    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line = null;
    try {
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return sb.toString();
}
}

然后在您的Android应用程序上,您可以像这样实例化RestClient类(您甚至可以向查询添加POST或GET参数):

RestClient c = new RestClient("http://www.myserver.com/json.php");  
c.AddParam("my_field_value", 1);

try
{
    c.Execute(RequestMethod.POST);

    // Here you can parse the JSON with an instance of Gson class.
    Gson jsonObject = new Gson();
    String jsonOutput = jsonObject.toJson(c.getResponse());

            // Do whatever you need with the data.
}
catch (Exception e)
{
    e.printStackTrace();
}

瞧!您可以使用从Android应用程序中使用PHP脚本创建的JSON数据。不要忘记将android.permission.INTERNET添加到AndroidManifest.xml。否则,您的应用程序将无法与您的PHP脚本通信。

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
祝你好运。

答案 1 :(得分:3)

本教程有帮助吗? Connecting to MySQL database

答案 2 :(得分:3)

这可以通过多种方式完成,您可以做一些非常简单的事情,但随着您的进步并开始从服务器向您的应用发送更多信息,您需要实施更强大的功能。

虽然@Robert的回答是有效的,但我相信对于手机而言,使用JSON使用RESTful网络服务要好得多。

您可以根据需要对Web服务进行编程,我建议(如果您可以在java中进行服务器端编程),请查看GSON这是一个使用JSON的优秀库。通过使用JSON对象,您可以将所需的所有信息转换为字符串,然后让移动电话将其转换为Java对象。您可以随心所欲地执行任何操作,以便在UI中显示它或将其存储在数据库中。

答案 3 :(得分:1)

我最近这样做是为了检索我的信息而调用.Net网络服务。我从我的Android应用程序使用KSoap2调用了Web服务。在搜索时我找不到任何框架来使它更容易。最后它实际上变得相当容易。以下是您的出发点:

http://www.helloandroid.com/tutorials/using-ksoap2-android-and-parsing-output-data