一、写在前面

  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文件中

 <?php

 // 服务器
define('DB_HOST', '127.0.0.1'); //端口号
define('DB_PORT', '3306'); // 用户名
define('DB_USER', 'root'); // 密码
define('DB_PWD', ''); // 数据库名
define('DB_NAME', 'mysql'); ?>

2)然后写一个response响应,并生成json串,我这里采用的是status(boolean),msg和一个数据结构的方式;

JSON_UNESCAPED_UNICODE这句话是php5.1之后让echo出来的值跳过转为unicode码的方式
 <?php
class Response {
/**
* 按json方式输出通信数据
*
* @param unknown $status
* 状态码
* @param string $message
* 提示信息
* @param array $data
* 数据
* @return string
*/
public static function json($status, $message = '', $data = array()) {
if (! is_bool ( $status )) {
return '';
}
$result = array (
'status' => $status,
'message' => $message,
'data' => $data
);
echo json_encode ( $result,JSON_UNESCAPED_UNICODE);
}
}

3)下面直接来连接操作数据库进而得到json串

 <?php
require_once 'response.php';
require_once '../test01/db.php';
require_once 'connect_config.php'; $status = false;
$msg = '';
$data = array(); // $conn = Db::getInstance()->connect();
$conn = mysqli_connect(DB_HOST,DB_USER,DB_PWD,DB_NAME,DB_PORT) or die('数据库连接失败');
$query = "select * from aiya_user";
$data1 = mysqli_query($conn, $query);
if ($data1){
$status = true;
$msg = '成功';
$i = 0;
while($row = mysqli_fetch_array($data1)){
$data [$i]['username'] = $row['username'];
$data [$i]['password'] = $row['password'];
$data [$i]['birthday'] = $row['birthday'];
$i++;
}
echo Response::json($status,$msg,$data);
// echo '你好';
// echo '<br/>';
// 加入JSON_UNESCAPED_UNICODE 让php转换为json的时候绕过转码为unicode
// echo json_encode($value,JSON_UNESCAPED_UNICODE);
// echo urlencode(json_encode($value));
}else{
$status = false;
$msg = '数据查询失败';
$valuse = array(
$status,
$msg
);
echo json_encode($value,JSON_UNESCAPED_UNICODE);
}

4)运行我们的php文件可以看到:

5)为了看的清晰一些,我们采用json在线解析一下:

看起来的确有几分神似我们平时只用得到的json接口数据哈~这挺棒的。

 

四、android端

1)android端我暂且就采用当下主流的retrofit2.1.0进行网络访问,具体实用细节大家可以传送过去:http://www.cnblogs.com/liushilin/p/5680135.html

2)简单看下代码:

 package com.example.nanchen.nettest;

 import retrofit2.Call;
import retrofit2.http.GET; /**
* @author nanchen
* @fileName NetTest
* @packageName com.example.nanchen.nettest
* @date 2016/11/05 15:19
*/ public interface AppService { @GET("test_api.php")
Call<Response> listResponse(); }

Response.java

 package com.example.nanchen.nettest;

 import com.google.gson.annotations.SerializedName;

 import java.util.List;

 /**
* @author nanchen
* @fileName NetTest
* @packageName com.example.nanchen.nettest
* @date 2016/11/05 15:17
*/ public class Response {
@SerializedName("status")
public boolean status;
public String message;
public List<User> data;
}

用于存放数据的User.java

 package com.example.nanchen.nettest;

 /**
* @author nanchen
* @fileName NetTest
* @packageName com.example.nanchen.nettest
* @date 2016/11/05 15:22
*/ public class User {
private String username;
private String password;
private String birthday; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getBirthday() {
return birthday;
} public void setBirthday(String birthday) {
this.birthday = birthday;
} @Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", birthday='" + birthday + '\'' +
'}';
}
}

最后是MainActivity.java

 package com.example.nanchen.nettest;

 import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Toast; import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List; import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory; public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} public void btnClick(View view) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://10.1.1.113/AiYaSchoolPush/test/")
.addConverterFactory(GsonConverterFactory.create())
.build();
AppService service = retrofit.create(AppService.class); service.listResponse().enqueue(new Callback<Response>() {
@Override
public void onResponse(Call<Response> call, retrofit2.Response<Response> response) {
List<User> userList = response.body().data;
Toast.makeText(MainActivity.this, "访问成功:" + userList.toString(), Toast.LENGTH_LONG).show();
// Log.e(TAG,"访问成功:"+userList.toString());
for (int i = 0; i < userList.size(); i++) {
User user = userList.get(i);
String birthday = user.getBirthday();
Log.e(TAG, birthday);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
user.setBirthday(sdf.format(new Date(Long.valueOf(birthday))));
Log.e(TAG, user.toString());
}
} @Override
public void onFailure(Call<Response> call, Throwable t) {
Toast.makeText(MainActivity.this, "访问失败:" + t.getMessage(), Toast.LENGTH_LONG).show();
Log.e(TAG, "访问失败:" + t.getMessage());
}
}); } }

后记:这里只是简单使用php生成一个可访问接口,只可以在局域网进行访问,其中我的ip:10.1.1.113是路由器IP,只要你的服务器和手机在一个局域网就可以访问到这个json串了。这里还采用的是明文传输,在实际开发中我们却更多的使用加密的方式,并且还需要采用post等方式让android端和服务器进行交互,这些笔者都会持续更新,望大家持续关注~详情请关注楼主的开源app爱吖校推:https://github.com/nanchen2251/AiYaSchoolPush,可以fork得到第一手资讯,我后面会把服务器代码也开源出来~

本demo源码地址:https://github.com/nanchen2251/phpAndroidDemo

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

  1. Android 程序员必须知道的 53 个知识点

    1. android 单实例运行方法 我们都知道 Android 平台没有任务管理器,而内部 App 维护者一个 Activity history stack 来实现窗口显示和销毁,对于常规从快捷方式 ...

  2. Android程序员的进阶之路

    本文主要论述的是Android程序员的进阶之路,博主本人就是一名android开发攻城狮,所以这里讲述的大多数是android开发攻城狮的技术进阶之路,如有问题请多指正. 大家都知道程序员之中有有菜鸟 ...

  3. 给Android程序员的六个建议

    给Android程序员的六个建议 分类: 安卓相关2015-07-14 23:58 177人阅读 评论(0) 收藏 举报 android程序员 如果你一年前写的代码 , 在现在看来你还感觉写的很不错 ...

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

    在日常的开发中,尤其是app开发,因为不像web端那样 出错以后可以热更新,所以app开发 一般对软件质量有更高的要求(你可以想一下 一个发出去的版本如果有重大缺陷 需要强制更新新客户端是多么蛋疼的事 ...

  5. Android程序员必知必会的网络通信传输层协议——UDP和TCP

    1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...

  6. 迈向高阶:优秀Android程序员必知必会的网络基础

    1.前言 网络通信一直是Android项目里比较重要的一个模块,Android开源项目上出现过很多优秀的网络框架,从一开始只是一些对HttpClient和HttpUrlConnection简易封装使用 ...

  7. IT观察】网络通信、图片显示、数据库操作……Android程序员如何利用开源框架

    每个Android 程序员都不是Android应用开发之路上孤军奋战的一个人,GitHub上浩如烟海的开源框架或类库就是前人为我们发明的轮子,有的轮子能提高软件性能,而有的轮子似乎是以牺牲性能为代价换 ...

  8. android程序员成长路径的思考

    我之前就想过要写这个话题,不过之前没有什么认识,我只是在阅读别人的见解,看法.昨天晚上,我阅读了这篇文章<产品经理罗永浩:用户体验探索,没有尽头>,这篇文章描述了罗永浩对锤子手机设计细节的 ...

  9. Android程序员不容错过的10款在线实用工具

    Android十款在线工具,在做Android开发过程中,会遇到一些小的问题,虽然自己动手也能解决,但是有了一些小工具,解决这些问题就得心应手了.Android在线工具,包括在线测试工具,及其他较为重 ...

随机推荐

  1. .NET Core全新路线图

    .NET Core / ASP.NET Core 1 RTM发布两周后,社区也很积极,收到了非常多的反馈,上周五微软的scott Hunter 在dotnet团队官方博客上发布了.NET Core全新 ...

  2. Socket聊天程序——客户端

    写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细 ...

  3. Matlab 绘制三维立体图(以地质异常体为例)

    前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...

  4. Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用

    通过本文你将学会如下内容: 1,如何使用Xamarin开发跨平台(Windows,Android,iOS)应用. 2,如何使用微软的登录界面登入Microsoft账号. 3,如何使用Outlook邮箱 ...

  5. Spring的数据库开发

                                Spring JDBC框架操作mysql数据库 Spring中的JDBC为我们省去连接和关闭数据库的代码,我们着重关注对数据库的操作.Sprin ...

  6. JavaWeb——Servlet

    一.基本概念 Servlet是运行在Web服务器上的小程序,通过http协议和客户端进行交互. 这里的客户端一般为浏览器,发送http请求(request)给服务器(如Tomcat).服务器接收到请求 ...

  7. 新技术≠颠覆:CIO 要有战略耐心

    新技术≠颠覆:CIO 要有战略耐心 大数据,云时代,互联网思维, 物联网--最近一两年,这些字眼一次次地出现在各种大大小小的CIO会议上和他们的私下交流圈子里,作为对新技术最敏感的人群,一方面他们迫切 ...

  8. 记录在Windows上安装和使用Oracle数据库过程中的坑

    1.安装Oracle Oracle软件是免费的,可以去官网下载相应的安装包.但是如果用于商业用途需要购买License.官网上针对各种平台,32位和64位都有,如果在Windows一般会下载到两个文件 ...

  9. 使用四元数解决万向节锁(Gimbal Lock)问题

    问题 使用四元数可以解决万向节锁的问题,但是我在实际使用中出现问题:我设计了一个程序,显示一个三维物体,用户可以输入绕zyx三个轴进行旋转的指令,物体进行相应的转动. 由于用户输入的是绕三个轴旋转的角 ...

  10. hibernate-mapping-3.0.dtd;hibernate-configuration-3.0.dtd;hibernate.properties所在路径

    hibernate-mapping-3.0.dtd 所在路径:hibernate-release-5.2.5.Final\project\hibernate-core\src\main\resourc ...