【php + MySQL + Android】Android端发送post请求访问服务器MySQL,对用户账号密码进行登录验证
前言
自己要做一个Android App,涉及到服务器端,以及Android客户端之间的交互,而网络上的的资源往往是只讲一个方面。所以自己每完成一段工作,会将开发过程记录下来,并供大家参考,相关文章放在专栏
【php + MySQL + Android】。
如果你遇到了什么问题,或者有好的建议,欢迎在评论区留言,或者私信我,大家一起交流。
😹作者也是小白,期待与你一起成长。
------------------------------------------------------------------------独学而无友, 则孤陋而寡闻
服用须知 🚀🚀🚀
- 🚀🚀🚀遇到不懂的一定一定记得看专栏中前面的内容,这个项目是从零开始,连续记录的。没有的代码全在前面。
- 🚀🚀🚀🚀🚀有任何问题都可以私信我。
目录
前言
功能描述:
预备知识(建议有看不懂的再回来点相应的链接进去学习)
重难知识点整理:
Json
Toast
Http获取返回有延时
代码
功能描述:
- 手机上输入账号和密码
- 将账号和密码发送到服务器
- 服务器在MySql中查询输入的账号密码是否存在,并且给手机端返回如下结果:
字符串 | 代表含义 |
"0" | 账号密码不在数据库中 |
"1" | 账号密码正确 |
"404" | 服务器端连接不到数据库 |
4.手机端收到返回,根据返回的字符串进行不同的提示。
预备知识(建议有看不懂的再回来点相应的链接进去学习)
- POST常用设置
方法 | 描述 |
---|---|
SetRequestMethod(String) | 设置连接方式 |
urlCon.setDoInput(true) | 设置输入是否允许 |
urlCon.setDoOutput(true) | 设置输出是否允许 |
setRequestProperty(String,String) | 配置请求属性 |
- 关于Http的知识
【php + MySQL + Android】一个超简单的Http实践_勇敢di牛牛的博客-CSDN博客一个超简单的Android Http实践。https://blog.csdn.net/niuguobao/article/details/124307587?spm=1001.2014.3001.5502
- 登录界面UI的代码
【php + MySQL + Android】Android登陆界面设计(1)_勇敢di牛牛的博客-CSDN博客做一个简单的登陆界面。https://blog.csdn.net/niuguobao/article/details/124299640?spm=1001.2014.3001.5502
- 关于php的知识,以及对Mysql的操作
【php + MySQL + Android】php对数据库进行操作(1)_勇敢di牛牛的博客-CSDN博客php语言对数据库进行操作。https://blog.csdn.net/niuguobao/article/details/124248858?spm=1001.2014.3001.5502
重难知识点整理:
-
Json
- 🚀Json是什么?
答:JavaScript Object Natation, 一种轻量级的数据交换格式, 与XML一样,
广泛被采用的客户端和服务端交互的解决方案!具有良好的可读和便于快速编写的特性
- 🚀Android中创建json并且添加内容:
JSONObject json = new JSONObject();json.put("username",username);json.put("password",password);
- 🚀服务器中收到的json字符串
{ "username":"yongganniuniu","password":"123456" }
- 🚀🚀🚀服务器的php文件对收到json解析(重点中的重点)
$res = file_get_contents("php://input");//接受参数post$josn = json_decode($res, true); //解析$password = $josn["password"]; //提取账号密码$username = $josn["username"];
-
Toast
- 🚀Tost实现:
Toast toast = Toast.makeText(MainActivity.this, tip,Toast.LENGTH_SHORT); toast.show(); //只有调用了show方法才会显示
- Toast.makeText()各个参数都是干嘛的
Toast:是一个类,主要管理消息的提示。
makeText(),是Toast的一个方法,用来显示信息,分别有三个参数。
🚒第一个参数:是上下文参数,指当前页面显示
🚒第二个参数:是你想要显示的内容。
🚒第三个参数:Toast.LENGTH_LONG是你指你提示消息,显示的时间,这个是稍微长点
对应的另一个是ToastLENGTH_SHORT,这个时间短点儿,大概2秒钟。
-
Http获取返回有延时
执行post请求需要时间,我们的执行是异步多线程,不能在发送post请求后立马做出判断,要等消息返回在执行相关操作。
Android代码
package com.example.testapp;import android.annotation.SuppressLint;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;import org.json.JSONException;import org.json.JSONObject;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;public class MainActivity extends Activity { Button btn_login; Button btn_register; EditText edt_user; EditText edt_password; //private Handler handler; private String res; private static final int SUCCESS = 0; private static final int FAILURE = 1; // private String password= ""; private String username =""; String stringUrl = "http://nnggb.com/test/test.php"; private Handler mHander = new Handler(Looper.getMainLooper()) { @SuppressLint("SetTextI18n") public void handleMessage(Message msg) { switch(msg.what){ case SUCCESS: ShowLoginToast(); //提示账号密码是否正确以及服务器是否出现问题 break; case FAILURE: Toast toast = Toast.makeText(MainActivity.this,"请求失败,请检查网络",Toast.LENGTH_SHORT); toast.show(); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_login = findViewById(R.id.bt_login); btn_register = findViewById(R.id.bt_register); edt_user = findViewById(R.id.edt_user); edt_password =findViewById(R.id.edt_password); btn_login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { username = String.valueOf(edt_user.getText()); //获取文本框内容 password = String.valueOf(edt_password.getText()); GetURLResByPost(); //ShowLoginToast(); //千万不能写在这里,这里网络请求还没回来,res是空的 } }); } public void GetURLResByPost(){ new Thread(new Runnable(){ public void run(){ try { JSONObject json = new JSONObject(); json.put("username",username); json.put("password",password); Log.i("勇敢id牛牛", String.valueOf(json)); URL myurl = new URL(stringUrl); HttpURLConnection urlCon = (HttpURLConnection)myurl.openConnection(); urlCon.setConnectTimeout(3000); urlCon.setDoInput(true); //设置允许输入 urlCon.setDoOutput(true);//设置输出允许 urlCon.setRequestMethod("POST"); OutputStreamWriter out = new OutputStreamWriter(urlCon.getOutputStream()); //DataOutputStream out = new DataOutputStream(urlCon.getOutputStream()); out.write(json.toString()); out.flush(); out.close(); if(urlCon.getResponseCode() == 200){ InputStreamReader in = new InputStreamReader(urlCon.getInputStream()); BufferedReader buffer = new BufferedReader(in);// String inputLine = null;// StringBuffer pageBuffer = new StringBuffer();// while((inputLine = buffer.readLine()) != null){//pageBuffer.append(inputLine +"\n");// } //上面的写法是接受的数据有多行,我这里只有一个数字。用着个方法会多一个空格。 //res = String.valueOf(buffer.read()); //这种写法是错误的 res = buffer.readLine(); //只读取第一行 mHander.sendEmptyMessage(0); in.close(); buffer.close(); urlCon.disconnect(); }else{ mHander.sendEmptyMessage(1); } } catch (MalformedURLException e) { e.printStackTrace(); mHander.sendEmptyMessage(1); } catch (IOException e) { mHander.sendEmptyMessage(1); e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } } }).start(); } public void ShowLoginToast(){ String tip = ""; if (res.equals("0")){ //查询的密码不正确 tip = "账号或密码不正确"; }else if(res.equals("1")){ tip = "登录成功 "; }else if(res.equals("404")){ tip = "服务器端配置错误"; } if (!tip.equals("")){ Toast toast = Toast.makeText(MainActivity.this, tip,Toast.LENGTH_SHORT); toast.show(); } }}
PHP代码
<?phpheader('content-type:text/html;charset=utf-8');define('servername','localhost');//主机名define('username', 'ngbtest');//连接数据库的用户名define('password','174927');//连接数据库密码define('dbname', 'ngbtest');//数据库名称//echo "
" .username ."
". password ."
" .dbname ;// 创建连接extract($_POST);$res = file_get_contents("php://input");$josn = json_decode($res, true);$password = $josn["password"];$username = $josn["username"];$conn = new mysqli(servername, username, password, dbname);// 检测连接if ($conn->connect_error) { echo "404"; //die("连接失败: " . $conn->connect_error);}$sql="SELECT `username` FROM `test` WHERE `username`= '$username' AND `email` = '$password' ";$res = $conn->query($sql);if ($res->num_rows > 0) { // 输出数据 //$row= mysqli_fetch_assoc($res); echo "1";}else{ echo "0"; //$_SESSION['username'] = "xxx";}?>
🚀看完了还有疑问请私信我,或者评论区留言。
🚀发现错误或者有建议,请评论区留言或私信。