如果是PHP做的服务端,而我们要用android去访问,怎么办?当然可以用REST,但也可以用点笨的方法,比如可以让PHP的服务端返回JSON或XML数据,而Android端则可以用APACHE的httpclient去访问。

下面是一个例子,假设数据表中users表有如下字段(mysql):
idusers,UserName,FullName

加点数据,然后在服务端建立一个webservice1.php,作用是直接返回服务端数据库的数据,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
if (isset($_GET['user']) && intval($_GET['user'])) {
    $format strtolower($_GET['format']) == 'json' 'json' 'xml'//xml is the default
    $user_id intval($_GET['user']); //no default
     
    /* 连接数据库 */
    $link = mysql_connect('localhost','root','xxxxx'or die('Cannot connect to the DB');
    mysql_select_db('jsonandroid',$linkor die('Cannot select the DB');
     
    $query "SELECT * FROM 'users'";
    $result = mysql_query($query,$link);
     
    $posts array();
    if (mysql_num_rows($result)) {
        while($post = mysql_fetch_assoc($result)) {
            $posts[] = array('post'=>$post);
        }
    }
     
    /* json格式 */
    if($format == 'json') {
        header('Content-type: application/json');
        echo json_encode(array('posts'=>$posts));
    }
    else {
        header('Content-type: text/xml');
        echo '<posts>';
        foreach ($posts as $index => $post) {
            if (is_array($post)) {
                foreach($post as $key => $value) {
                    echo '<',$key,'>';
                    if (is_array($value)) {
                        foreach($value as $tag => $val) {
                            echo'<',$tag,'>',htmlentities($val),'</',$tag,'>';
                        }
                    }
                    echo '</',$key,'>';
                }
            }
        }
        echo '</posts>';
    }
}
?>

则可以把数据表输出为JSON或者XML格式了,客户端的Android调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
try {
    HttpParams httpParams = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILLISEC);
    HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);
     
    HttpParams p = new BasicHttpParams();
     
    p.setParameter("user""1");
     
    HttpClient httpclient = new DefaultHttpClient(p);
    HttpPost httppost = new HttpPost(url);
     
    try {
        Log.i(getClass().getSimpleName(), "send  task - start");
         
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("user""1"));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        ResponseHandler<String> responseHandler = new BasicResponseHandler();
        String responseBody = httpclient.execute(httppost, responseHandler);
        // 解析JSON返回的 JSONObject json = new JSONObject(responseBody);
        JSONArray jArray = json.getJSONArray("posts");
        ArrayList<HashMap<String, String>> mylist = newArrayList<HashMap<String, String>>();
 
        for (int i = 0; i < jArray.length(); i++) {
            HashMap<String, String> map = new HashMap<String, String>();
            JSONObject e = jArray.getJSONObject(i);
            String s = e.getString("post");
            JSONObject jObject = new JSONObject(s);
 
            map.put("idusers", jObject.getString("idusers"));
            map.put("UserName", jObject.getString("UserName"));
            map.put("FullName", jObject.getString("FullName"));
 
            mylist.add(map);
        }
        Toast.makeText(this, responseBody, Toast.LENGTH_LONG).show();

再搞个webservice2.php,该文件用来接受并保存客户端传送过来的JSON数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$json file_get_contents('php://input');
$obj = json_decode($json);
 
//保存数据库
$con = mysql_connect('localhost','root','XXX'or die('Cannot connect to the DB');
mysql_select_db('jsonandroid'$con);
 
mysql_query("INSERT INTO 'users' (UserName, FullName) VALUES ('".$obj->{'UserName'}."''".$obj->{'FullName'}."')");
 
mysql_close($con);
 
$posts array(1);
header('Content-type: application/json');
echo json_encode(array('posts'=>$posts));
?>

而Android客户端,可以构造JSON,发送到webservice2.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
try {
    JSONObject json = new JSONObject();
    json.put("UserName""test2");
    json.put("FullName""1234567");
    HttpParams httpParams = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILLISEC);
    HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);
    HttpClient client = new DefaultHttpClient(httpParams);
 
    HttpPost request = new HttpPost(url);
    request.setEntity(new ByteArrayEntity(json.toString().getBytes("UTF8")));
    request.setHeader("json", json.toString());
    HttpResponse response = client.execute(request);
    HttpEntity entity = response.getEntity();
     
    if (entity != null) {
        InputStream instream = entity.getContent();
 
        String result = RestClient.convertStreamToString(instream);
        Log.i("Read from server", result);
        Toast.makeText(this,  result,
                Toast.LENGTH_LONG).show();
    }

这样就可以把Android端发送的数据保存到服务端了。

posted on 2012-02-23 17:32  kitea  阅读(183)  评论(0)    收藏  举报