如果是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 | <?phpif (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',$link) or 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$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端发送的数据保存到服务端了。
浙公网安备 33010602011771号