我想从Android应用程序中的Web服务器检索数据,并且不知道从哪里开始。我应该使用网络服务吗?
答案 0 :(得分:24)
我会推荐这些教程:
Connect android with PHP and MySql,JSON in android和PHP 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