一、寫在前面
web開發有前端和后端之分,其實android還是有前端和后端之分。android開發就相當於手機app的前端,一般都是php+android或者jsp+android開發。android和php在當下如此熱門,我想作為一個android程序員還是應該清楚android與php的交互的,那么,今天我們就來嘗試一波~
二、環境准備
1)雖然現在十分流行wamp(windows+apache+mysql+php)和lamp的php開發模式,但是為了省時省力,今天我們就暫且使用xampp作為環境搭建,xampp的便捷性我想大家一定早有耳聞,這里就不做詳細介紹,下載地址:https://www.apachefriends.org/zh_cn/index.html
2)安裝過程十分簡單,和常規安裝方法都是差不多,安裝目錄一定要在磁盤根目錄,我這里就安裝在F盤根目錄。

3)安裝結束后,找到xampp-control.exe,點擊運行;

4)啟動apache服務和mysql服務,mysql的初始賬號為root,密碼為空,如需修改自己修改配置文件,如果端口被占用也可以直接通過修改config文件來修改端口(點擊config查找listen並修改它就好了),是的,如果你點擊start后背景變為這個顏色,就代表你啟動服務成功了。

5)端口被占用的話點擊config查找listen並修改它就好了

6)檢測環境,在瀏覽器輸入127.0.0.1:80(默認端口為80的時候可以不輸入),如果能彈出下面的頁面就正確的

7)點擊phpInfo可以看到當前php環境的情況,點擊phpMyadmin可以看mysql數據庫,並對其操作;

查看mysql,我們可以在mysql數據庫下建表和做一切的數據庫操作(你可以使用GUI,也可以使用sql語句,看個人喜好吧);

8)搭建環境就花了太多時間就不好了,下面速度創建一個表,並插入部分數據,省的偏題了,畢竟我們不是來研究如何搭建環境的。
可以看到我這里在Mysql下建立了一個表,表名為aiya_user,並插入了兩條數據;

三、PHP端
1)終於到了php代碼編寫階段,下面我們就把數據庫中的兩條數據信息轉換為json並在android端成功訪問起來。
我們先把表的信息存放在一個php文件中
1 <?php 2 3 // 服務器 4 define('DB_HOST', '127.0.0.1'); 5 6 //端口號 7 define('DB_PORT', '3306'); 8 9 // 用戶名 10 define('DB_USER', 'root'); 11 12 // 密碼 13 define('DB_PWD', ''); 14 15 // 數據庫名 16 define('DB_NAME', 'mysql'); 17 18 ?>
2)然后寫一個response響應,並生成json串,我這里采用的是status(boolean),msg和一個數據結構的方式;
JSON_UNESCAPED_UNICODE這句話是php5.1之后讓echo出來的值跳過轉為unicode碼的方式
1 <?php 2 class Response { 3 /** 4 * 按json方式輸出通信數據 5 * 6 * @param unknown $status 7 * 狀態碼 8 * @param string $message 9 * 提示信息 10 * @param array $data 11 * 數據 12 * @return string 13 */ 14 public static function json($status, $message = '', $data = array()) { 15 if (! is_bool ( $status )) { 16 return ''; 17 } 18 $result = array ( 19 'status' => $status, 20 'message' => $message, 21 'data' => $data 22 ); 23 echo json_encode ( $result,JSON_UNESCAPED_UNICODE); 24 } 25 }
3)下面直接來連接操作數據庫進而得到json串
1 <?php 2 require_once 'response.php'; 3 require_once '../test01/db.php'; 4 require_once 'connect_config.php'; 5 6 $status = false; 7 $msg = ''; 8 $data = array(); 9 10 // $conn = Db::getInstance()->connect(); 11 $conn = mysqli_connect(DB_HOST,DB_USER,DB_PWD,DB_NAME,DB_PORT) or die('數據庫連接失敗'); 12 $query = "select * from aiya_user"; 13 $data1 = mysqli_query($conn, $query); 14 if ($data1){ 15 $status = true; 16 $msg = '成功'; 17 $i = 0; 18 while($row = mysqli_fetch_array($data1)){ 19 $data [$i]['username'] = $row['username']; 20 $data [$i]['password'] = $row['password']; 21 $data [$i]['birthday'] = $row['birthday']; 22 $i++; 23 } 24 echo Response::json($status,$msg,$data); 25 // echo '你好'; 26 // echo '<br/>'; 27 // 加入JSON_UNESCAPED_UNICODE 讓php轉換為json的時候繞過轉碼為unicode 28 // echo json_encode($value,JSON_UNESCAPED_UNICODE); 29 // echo urlencode(json_encode($value)); 30 }else{ 31 $status = false; 32 $msg = '數據查詢失敗'; 33 $valuse = array( 34 $status, 35 $msg 36 ); 37 echo json_encode($value,JSON_UNESCAPED_UNICODE); 38 }
4)運行我們的php文件可以看到:

5)為了看的清晰一些,我們采用json在線解析一下:

看起來的確有幾分神似我們平時只用得到的json接口數據哈~這挺棒的。
四、android端
1)android端我暫且就采用當下主流的retrofit2.1.0進行網絡訪問,具體實用細節大家可以傳送過去:http://www.cnblogs.com/liushilin/p/5680135.html
2)簡單看下代碼:
1 package com.example.nanchen.nettest; 2 3 import retrofit2.Call; 4 import retrofit2.http.GET; 5 6 /** 7 * @author nanchen 8 * @fileName NetTest 9 * @packageName com.example.nanchen.nettest 10 * @date 2016/11/05 15:19 11 */ 12 13 public interface AppService { 14 15 @GET("test_api.php") 16 Call<Response> listResponse(); 17 18 19 }
Response.java
1 package com.example.nanchen.nettest; 2 3 import com.google.gson.annotations.SerializedName; 4 5 import java.util.List; 6 7 /** 8 * @author nanchen 9 * @fileName NetTest 10 * @packageName com.example.nanchen.nettest 11 * @date 2016/11/05 15:17 12 */ 13 14 public class Response { 15 @SerializedName("status") 16 public boolean status; 17 public String message; 18 public List<User> data; 19 }
用於存放數據的User.java
1 package com.example.nanchen.nettest; 2 3 /** 4 * @author nanchen 5 * @fileName NetTest 6 * @packageName com.example.nanchen.nettest 7 * @date 2016/11/05 15:22 8 */ 9 10 public class User { 11 private String username; 12 private String password; 13 private String birthday; 14 15 public String getUsername() { 16 return username; 17 } 18 19 public void setUsername(String username) { 20 this.username = username; 21 } 22 23 public String getPassword() { 24 return password; 25 } 26 27 public void setPassword(String password) { 28 this.password = password; 29 } 30 31 public String getBirthday() { 32 return birthday; 33 } 34 35 public void setBirthday(String birthday) { 36 this.birthday = birthday; 37 } 38 39 @Override 40 public String toString() { 41 return "User{" + 42 "username='" + username + '\'' + 43 ", password='" + password + '\'' + 44 ", birthday='" + birthday + '\'' + 45 '}'; 46 } 47 }
最后是MainActivity.java
1 package com.example.nanchen.nettest; 2 3 import android.os.Bundle; 4 import android.support.v7.app.AppCompatActivity; 5 import android.util.Log; 6 import android.view.View; 7 import android.widget.Toast; 8 9 import java.text.SimpleDateFormat; 10 import java.util.Date; 11 import java.util.List; 12 13 import retrofit2.Call; 14 import retrofit2.Callback; 15 import retrofit2.Retrofit; 16 import retrofit2.converter.gson.GsonConverterFactory; 17 18 public class MainActivity extends AppCompatActivity { 19 private static final String TAG = "MainActivity"; 20 21 @Override 22 protected void onCreate(Bundle savedInstanceState) { 23 super.onCreate(savedInstanceState); 24 setContentView(R.layout.activity_main); 25 } 26 27 public void btnClick(View view) { 28 Retrofit retrofit = new Retrofit.Builder() 29 .baseUrl("http://10.1.1.113/AiYaSchoolPush/test/") 30 .addConverterFactory(GsonConverterFactory.create()) 31 .build(); 32 AppService service = retrofit.create(AppService.class); 33 34 service.listResponse().enqueue(new Callback<Response>() { 35 @Override 36 public void onResponse(Call<Response> call, retrofit2.Response<Response> response) { 37 List<User> userList = response.body().data; 38 Toast.makeText(MainActivity.this, "訪問成功:" + userList.toString(), Toast.LENGTH_LONG).show(); 39 // Log.e(TAG,"訪問成功:"+userList.toString()); 40 for (int i = 0; i < userList.size(); i++) { 41 User user = userList.get(i); 42 String birthday = user.getBirthday(); 43 Log.e(TAG, birthday); 44 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 45 user.setBirthday(sdf.format(new Date(Long.valueOf(birthday)))); 46 Log.e(TAG, user.toString()); 47 } 48 } 49 50 @Override 51 public void onFailure(Call<Response> call, Throwable t) { 52 Toast.makeText(MainActivity.this, "訪問失敗:" + t.getMessage(), Toast.LENGTH_LONG).show(); 53 Log.e(TAG, "訪問失敗:" + t.getMessage()); 54 } 55 }); 56 57 } 58 59 60 }
后記:這里只是簡單使用php生成一個可訪問接口,只可以在局域網進行訪問,其中我的ip:10.1.1.113是路由器IP,只要你的服務器和手機在一個局域網就可以訪問到這個json串了。這里還采用的是明文傳輸,在實際開發中我們卻更多的使用加密的方式,並且還需要采用post等方式讓android端和服務器進行交互,這些筆者都會持續更新,望大家持續關注~詳情請關注樓主的開源app愛吖校推:https://github.com/nanchen2251/AiYaSchoolPush,可以fork得到第一手資訊,我后面會把服務器代碼也開源出來~
本demo源碼地址:https://github.com/nanchen2251/phpAndroidDemo
