【定有惊喜】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

时间: 2024-10-06 14:52:41

【定有惊喜】android程序员如何做自己的API接口?php与android的良好交互(附环境搭建),让前端数据动起来~的相关文章

android程序员成长路径的思考

我之前就想过要写这个话题,不过之前没有什么认识,我只是在阅读别人的见解,看法.昨天晚上,我阅读了这篇文章<产品经理罗永浩:用户体验探索,没有尽头>,这篇文章描述了罗永浩对锤子手机设计细节的阐述,及罗永浩对产品经理的看法,认识.恰巧阅读了这篇文章,我从中想到了android程序员的成长路径. 成长路径之一,可以做出产品经理要求的各种界面效果. android程序员,是做android系统上的应用的,一个应用就是一个产品.我是这样认为的,你可以做出好的产品,那么,你就是优秀的android程序员.

给Android程序员的一些面试建议

前言 应大家的邀请,写一篇关于Android面试相关的博客,需要说明的是本文只针对Android应用开发,不针对rom开发以及逆向工程.我想面试对于程序员来说是很重要的一件事件,面试结果的好坏直接决定了能否进入某个公司以及以什么级别和待遇进入某个公司.我参加面试的经验并不多,但是以面试官的身份面试别人倒是有很多次,所以我可以结合这些经验来介绍下如何更好地把握一个面试. 什么是合适的候选者 在介绍如何面试之前,这里先从公司的角度来分析:"到底什么样的候选者是公司所需要的技术人才?"就我在

给年后面试的Android程序员的一些面试建议

前言 今天写一篇关于Android面试相关的博客,需要说明的是本文只针对Android应用开发,不针对rom开发以及逆向工程.我想面试对于程序员来说是很重要的一件事件,面试结果的好坏直接决定了能否进入某个公司以及以什么级别和待遇进入某个公司.我参加面试的经验并不多,但是以面试官的身份面试别人倒是有很多次,所以我可以结合这些经验来介绍下如何更好地把握一个面试. 什么是合适的候选者 在介绍如何面试之前,这里先从公司的角度来分析:"到底什么样的候选者是公司所需要的技术人才?"就我在百度的一些

《极客头条》精选:每天每周每月每年程序员该做的事情

程序员每天该做的事 1.总结自己一天任务的完成情况 最好的方式是写工作日志,把自己今天完成了什么事情,遇见了什么问题都记录下来,日后翻看好处多多 2.考虑自己明天应该做的主要工作 把明天要做的事情列出来,并按照优先级排列,第二天应该把自己效率最高的时间分配给最重要的工作 3.考虑自己一天工作中失误的地方,并想出避免下一次再犯的方法出错不要紧,最重要的是不要重复犯相同的错误,那是愚蠢的 4.考虑自己一天工作完成的质量和效率能否还能提高 一天只提高1%,365天你的效率就能提高多少倍你知道吗?(1+

Android 程序员必须掌握的三种自动化测试方法

在日常的开发中,尤其是app开发,因为不像web端那样 出错以后可以热更新,所以app开发 一般对软件质量有更高的要求(你可以想一下 一个发出去的版本如果有重大缺陷 需要强制更新新客户端是多么蛋疼的事情). 恩,所以我们app的开发者 一定要学会自己测试自己的代码 自己测试自己的app,不要寄希望于测试来帮你找bug,实际上,我工作多年的经验告诉,绝大多数隐藏极深的bug 都是开发自己发现的. 所以 今天就来教大家几招,如何测试自己的app,测试自己的模块. 1.Monkey http://de

挨踢部落故事汇(20):Android程序员的十大转型之路

玖哥是一个来自东北的Android攻城狮,现在定居被誉为"大湖名城,创(chuan)新(xiao)高地"的合肥.知识面极广,不仅广泛涉猎IT相关知识,还热爱文学,性格幽默,被誉为"会搞Android的段子手".他还是一个藏书人士,拥有汗牛充栋的IT书籍,而且每本书都认真阅读过,从不拿书当摆设. 玖哥·Android攻城狮 先说说Android程序员不可能转型的几个方向,以下四个不靠谱方向的靠谱性递减: 首先不会转型iOS,iOS和Android工程师的工作内容都是大

Android程序员学习之路

和一些刚工作以及未毕业的同学沟通,很多同学对在没有工作机会或熟练Android人员指导的情况下,如何学习Android并提高Android水平比较关心.下面我从几个方面介绍一些方法和方式来和大家分享: 1.Android知识 1.1.网站资源 1.1.1.Android官网 这个是最权威最官方的.主要看设计篇 和开发篇 .API相关接口用到哪一个接口再去看.不用挨个看.当然现在可能会被墙,大家也可以看本地SDK目录下的docs中的index.html打开后的文档. 1.1.2.stackover

据说年薪30万的Android程序员必须知道的帖子

据说年薪30万的Android程序员必须知道的帖子 标签: android 2015-03-12 16:52 10443人阅读 评论(10) 收藏 举报 Android中国开发精英 目前包括: Android开源项目第一篇——个性化控件(View)篇       包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar.TextView.ScrollView.TimeView.TipView.FlipVi

程序员,做技术神马的,请对自己好一点!

昨天在Google图片中输入“程序员”,搜索到的第一张图片是这样的: 一位平头兄桌上两台笔记本一台台式机.其中的一台中显示是某个论坛的页面[估计正在回答某个问题].中间那台正在启动Eclipse[要开始写Java程序了].平头兄的目光此时盯在台式机的显示器上[应该是正在远程或者是某个虚拟机],旁边还有一本打开的书… 图片的名字是“真正的程序员就应该这样”,程序员就应该这样么? 是谁规定程序员就应该是这样的,本来是应该四个人做的事情让一个程序员做,难道程序员是四核的? 作为程序员中的一份子,我时刻