【定有驚喜】android程序員如何做自己的API接口?php與android的良好交互(附環境搭建),讓前端數據動起來~


一、寫在前面

  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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM