前言
新手强烈建议先看之前的文章:
【php + MySQL + Android】Android登陆界面设计(1)_勇敢di牛牛的博客-CSDN博客做一个简单的登陆界面。https://blog.csdn.net/niuguobao/article/details/124299640?spm=1001.2014.3001.5502
【php + MySQL + Android】一个超简单的Http实践_勇敢di牛牛的博客-CSDN博客一个超简单的Android Http实践。https://blog.csdn.net/niuguobao/article/details/124307587?spm=1001.2014.3001.5502
【php + MySQL + Android】Android端发送post请求访问服务器MySQL,对用户账号密码进行登录验证_勇敢di牛牛的博客-CSDN博客Android端发送post请求访问服务器MySQL,对用户账号密码进行登录验证。连续更新,超详细。https://blog.csdn.net/niuguobao/article/details/124332051?spm=1001.2014.3001.5502
目录
功能以及内容概述:
用户第一次使用本App时需要注册,注册时会向服务器端发送请求,服务器验证请求后将账号密码以及其他账号信息保存在服务器的用户信息数据库中;
注册功能实现流程图
注册部分的程序分为两部分,Android端的程序和服务器端的应用。Android端程序需要获取用户输入在控件中的信息,使用Json进行封装,其格式如日志所示:
用户提交的Json表单格式
通过okhttp3 模块用Post方法将封装后的Json数据发送至服务器端,服务器端接受到请求后,首先使用PHP的 Json decode方法对Json数据进行解析,然后使用SQL语句在 MySQL中的用户信息表单中查寻解析后的Username,如果查询到信息则证明此用户已被注册,将相应的编码发送Android 端,提醒用户修改用户名或找回密码。
技术点讲解
Json_decode 方法
在使用PHP的Json decode方法的时候需要注意:这里解析Json有两种方式,其函数式有两个参数,第一个参数是我们需要解析的Json文本,第二个参数为Assoc,当期为True时返回Array,否则返回Object,这两种Type的取值方式是不一样的,使用的时候如果不注意则可能出现表单数据无法上传的问题。
json_decode接受一个JSON格式的字符串并且把它转换为PHP变量 ,当该参数$assoc为TRUE时,将返回array,否则返回object。
JSON 格式的字符串
$json = '{"a":"php","b":"mysql","c":3}';
其中a为键,php为a的键值。
实例:
<?php $json = '{"a":"php","b":"mysql","c":3}'; $json_Class=json_decode($json); $json_Array=json_decode($json, true); print_r($json_Class); print_r($json_Array); ?>
程序输出:
stdClass Object ([a] => php
[b] => mysql
[c] => 3 )
Array (
[a] => php
[b] => mysql
[c] => 3 )
在上面代码的前提下访问对象类型$json_Class的a的值
echo $json_Class->{'a'};
程序输出:php
访问数组类型$json_Array的a的值
echo $json_Array['a'];
下面是Php端的代码:
<?php
header('content-type:text/html;charset=utf-8');
define('servername','localhost');//主机名
define('username1', 'ngbt');//连接数据库的用户名
define('password','1749457');//连接数据库密码
define('dbname', 'test');//数据库名称
//echo "<br>" .username ."<br>". password ."<br>" .dbname ;
// 创建连接
extract($_POST);
$res = file_get_contents("php://input");
echo $res;
$json = json_decode($res, true);
echo "json";
echo "$json";
$email = $json["email"];
echo $email;
$password = $json['password'];
$username = $json['username'];
echo "$username";
$conn = new mysqli(servername, username1, password, dbname);
// 检测连接
if ($conn->connect_error) {
echo "404";
//die("连接失败: " . $conn->connect_error);
}
$sql = "SELECT `username` FROM `test` WHERE `username`='$username' ";//使用命名参数作为占位符的预处理语句
echo "$username";
$gender = 1;
$tel = 18888888888;
$res = $conn->query($sql);
if ($res->num_rows > 0) {
// 输出数据
echo "-1"; //用户名已存在
} else {
$sql="INSERT INTO `test`(`username`,`gender`,`email`,`num`,`password` )values('$username','$gender','$email','$tel','$password')";
if ($conn->query($sql) === TRUE) {
echo "1"; //注册成功
}else{
echo "0";//注册失败
}
}
?>
上面是先对账户信息进行查询操作。
OkHttp3
OkHttp是一款优秀的HTTP客户端框架,OkHttp3是OkHttp发展到版本3.0之后的名字,目前大量项目和公司仍在采用该框架。Apache HttpClient有着不凡的性能、丰富的功能以及强大的自定义实现等特色。但是随着计算机技术的不断发展和设计理念的持续改变,Apache HttpClient便显得有些落伍。Apache HttpClient和OkHttp3相比,主要的劣势在于Apache HttpClient的API设计过于臃肿,使用起来有十分不便,此外Apache HttpClient对于一些功能没有提供原生化的支持,需要在每次使用的时候自定义(比如池化HTTP请求、空闲连接处理等),对于首次接触的开发者就显得不是很友好。而OkHttp3是一款对新手很友好的框架,简单易懂的API以及原生封装高级功能的特性使得用户在进行简单的请求时只需要编写少量代码即可完成功能。
下面本次代码实现的实例:
package com.example.testapp.Util;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.Button;
import com.example.testapp.RegisterActivity;
import org.json.JSONObject;
import java.io.IOException;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class NetWorkHelper {
private static String TAG = "NetWorkHelper";
public static final int SUCCESS = 1;
public static final int FAIL = 2;
public static void PostData(String url , JSONObject json){
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// 开启线程分析数据
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Log.i(TAG, "开始网络线程");
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), String.valueOf(json));
Log.i(TAG, "run: "+requestBody);
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
Response response = client.newCall(request).execute();
String resStr = response.body().string();
Log.i(TAG, "获取成功 response:"+ resStr);
} catch (IOException e) {
e.printStackTrace();
sendFailMessage();
}
sendSuccessMessage();
}
});
thread.start();
}
}, 500);
}
private static void sendSuccessMessage(){
Message message = new Message();
message.what = SUCCESS;
RegisterActivity.handler.sendMessage(message);
}
private static void sendFailMessage(){
Message message = new Message();
message.what = FAIL;
RegisterActivity.handler.sendMessage(message);
}
}
上面将其写在一个方法类中,执行完操作后,向实现注册功能的RegisterActivity,发送消息然后执行结果,上面需要两个参数,第一个是服务器端写的注册接口,第二个是需要提交的Json数据,包含用户名,邮箱密码等。
其他的代码在本人的项目地址中可以查看:
😽作者:勇敢di牛牛
🚀个人项目地址:englishlearningapp
个人简介:有一年工作经验的大学生。
工作:汽车系统应用开发
个人网站:牛牛の小窝
🚏独学而无友,则孤陋而寡闻
版权归原作者 勇敢di牛牛 所有, 如有侵权,请联系我们删除。