啥都不说了,直接上代码。如果看不懂在下面和我留言。
先看服务端:使用PHP语言,部署在新浪sae服务器(自带数据库)
将一下所有php文件放在同一个目录下:
1.db.php 封装好的用于连接数据库的类
<?php
class Db{
static private $_instance;
static private $_connectSource;
//因为是连接新浪sae服务器所以下面的参数不生效。
/*private $_dbConfig=array(
'host'=>'127.0.0.1',
'user'=>'root',
'password'=>'',
'database'=>'value'
); */
private function _construct(){
}
static public function getInstance(){
//如果没有实例,则创建, 然后返回已创建的实例
if(!(self::$_instance instanceof self)){
self::$_instance =new self();
}
return self::$_instance;
}
public function connect(){
if(!self::$_connectSource){
self::$_connectSource=mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
//self::$_connectSource = @mysql_connect($this->_dbConfig['host'], $this->_dbConfig['user'], $this->_dbConfig['password']);
if(!self::$_connectSource){
//如果数据库连接不成功
//抛出异常,在调用该connnect()函数时,通过try catch 进行捕获
throw new Exception ('mysql connect error'.mysql_error);
//die('mysql connect error'.mysql_error);
}
mysql_select_db(SAE_MYSQL_DB,self::$_connectSource);
//mysql_select_db($this->_dbConfig['database'], self::$_connectSource);
mysql_query("set names UTF8",self::$_connectSource);
}
return self::$_connectSource;
}
}
2.response.php 用于封装通信数据(json或者xml)
<?php
class Response {
const JSON = "json";
/**
* 按综合方式输出通信数据
* @param integer $code 状态码
* @param string $message 提示信息
* @param array $data 数据
* @param string $type 数据类型
* return string
*/
public static function show($code, $message = '', $data = array(), $type = self::JSON) {
if(!is_numeric($code)) {
return '';
}
$type = isset($_GET['format']) ? $_GET['format'] : self::JSON;
$result = array(
'code' => $code,
'message' => $message,
'data' => $data,
);
if($type == 'json') {
self::json($code, $message, $data);
exit;
} elseif($type == 'array') {
var_dump($result);
} elseif($type == 'xml') {
self::xmlEncode($code, $message, $data);
exit;
} else {
// TODO
}
}
/**
* 按json方式输出通信数据
* @param integer $code 状态码
* @param string $message 提示信息
* @param array $data 数据
* return string
*/
public static function json($code, $message = '', $data = array()) {
if(!is_numeric($code)) {
return '';
}
$result = array(
'code' => $code,
'message' => $message,
'data' => $data
);
echo json_encode($result);
exit;
}
/**
* 按xml方式输出通信数据
* @param integer $code 状态码
* @param string $message 提示信息
* @param array $data 数据
* return string
*/
public static function xmlEncode($code, $message, $data = array()) {
if(!is_numeric($code)) {
return '';
}
$result = array(
'code' => $code,
'message' => $message,
'data' => $data,
);
//header("Content-Type:text/xml");
$xml = "<?xml version='1.0' encoding='UTF-8'?>\n";
$xml .= "<root>\n";
$xml .= self::xmlToEncode($result);
$xml .= "</root>";
echo $xml;
}
public static function xmlToEncode($data) {
$xml = $attr = "";
foreach($data as $key => $value) {
if(is_numeric($key)) {
$attr = " id='{$key}'";
$key = "item";
}
$xml .= "<{$key}{$attr}>";
$xml .= is_array($value) ? self::xmlToEncode($value) : $value;
$xml .= "</{$key}>\n";
}
return $xml;
}
}
3.checklogin.php 提供给客户端 ,让客户端使用GET请求,传入username,passwd 验证登录
<?php
//这是app验证登录接口
//访问方式http://****.com/bee/checklogin.php
if($_GET['format']=='xml'){
header("Content-Type:text/xml");}
require_once('./response.php');//引入数据封装类
require_once('./db.php');//引入数据库类
$username=$_GET['username'];
$passwd=$_GET['passwd'];
$sql = "select * from user where `username`='$username' and `passwd`='$passwd'";
try{
$connect=Db::getInstance()->connect();
}catch(Exception $e){
Response::show(403,'数据库连接失败');
}
$result=mysql_query($sql,$connect);
$videos=array();
//mysql_fetch_assoc()字段名key植是value,方便客户端解析。每行获取,区别与mysql_fetch_array()
while($video=mysql_fetch_assoc($result)){
$videos[]=$video;
}
//这样就从数据库中获取了数据存到了$videos[]中,接着需要转换成接口数据
if($videos){
Response::show(200,'首页数据获取成功',$videos);
//这样默认生成了json数据,如果需要xml数据,需要在访问时http://...com/list.php?format=xml
}else{
Response::show(400,'首页数据获取失败',$videos);
}
------------------------------------------------------------------------------------------------------------------------------------------------------------
到这里服务端代码已经完成,接受客户端的hhtp get请求,通过查询数据库,验证用户名,密码是否正确。将结果封装成json或者xml,输出在浏览器中。供客户端读取。
下面是安卓客户端部分代码:
布局文件就不展示了,就是两个textview 和两个edittext,还有一个Button
直接上MainActivity.java
package com.example.bee;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class Login extends Activity {
/**
* 用于登录的界面
*/
String result="",user,passwd;
Handler myhandler;
EditText userview,passwdview;
Button login,register;
Thread t;
SharedPreferences sp;
int code;
String realname;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
userview=(EditText) findViewById(R.id.login_edt_user);
passwdview=(EditText) findViewById(R.id.login_edt_passwd);
login=(Button) findViewById(R.id.btn_login);
register=(Button) findViewById(R.id.btn_register);
sp=getSharedPreferences("login", MODE_PRIVATE);
String getname=sp.getString("username", null);
if(getname==null)
{
Toast.makeText(Login.this, "sp null", 0).show();
}else{
Toast.makeText(Login.this, "sp have", 0).show();
userview.setText(sp.getString("username", null));
passwdview.setText(sp.getString("passwd", null));
}
//登陆按钮点击事件
login.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
t=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
user=userview.getText().toString();
passwd=passwdview.getText().toString();
URL url=new URL("http://luo.sinaapp.com/e/checklogin.php?username="+user+"&passwd="+passwd);
HttpURLConnection urlConnection=(HttpURLConnection) url.openConnection();
InputStreamReader isr=new InputStreamReader(urlConnection.getInputStream());
BufferedReader br=new BufferedReader(isr);
result=br.readLine();
//对获得的json数据进行解析
try {
JSONObject object=new JSONObject(result);
code=object.getInt("code");
JSONArray ja= object.getJSONArray("data");
String data=ja.getString(0);
JSONObject secondobject=new JSONObject(data);
realname=secondobject.getString("realname");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Message m1=myhandler.obtainMessage();
if(code==400)//登录失败
{
m1.what=1;
myhandler.sendMessage(m1);
}else if(code==200){//登录成功
m1.what=2;
myhandler.sendMessage(m1);
}else{//其他情况:联网失败,服务器异常等
m1.what=3;
myhandler.sendMessage(m1);
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
t.start();
}
});
//注册点击事件
/*register.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i=new Intent(Login.this,RegisterActivity.class);
startActivity(i);
}
});*/
myhandler=new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
if(msg.what==1){
Toast.makeText(Login.this, "用户名或密码不正确", 0).show();
} else if(msg.what==2){
Toast.makeText(Login.this, "欢迎您:"+realname, 0).show();
/*登陆成功将数据写到本地保存下来,以便下次自动额登陆*/
sp=getSharedPreferences("login", MODE_PRIVATE);
Editor editor=sp.edit();
editor.putString("username", user);
editor.putString("passwd", passwd);
editor.putString("realname", realname);
editor.commit();
Intent i = new Intent(Login.this, MainActivity.class);
startActivity(i);
finish();
} else {
Toast.makeText(Login.this, "网络连接失败", 0).show();
}
}
};
}
}
如果对上面的sharedpreference 不了解请,到这里看一下:
http://blog.csdn.net/davidluo001/article/details/42290369
如有其他疑问请留言,一定尽快解答。