1、从控件中取出用户输入的信息,如:用户名、密码、邮箱......;
2、数据校验,检查用户输入的内容是否符合一定的规则。例如检查邮箱输入格式是否正确、密码是否安全。
QRegExp这个类可以很好帮助我们进行检验。
1 //用户名的正则表达式 "^[a-zA-Z0-9_@#-\*]\{3,16\}$" 2 //define USER_REG "^[a-zA-Z0-9_@#-\*]\{3,16\}$" 3 4 QRegExp regexp(USER_REG); 5 if(!regexp.exactMatch(userName)) //开始匹配用户输入的用户名 6 { 7 QMessageBox::warning(this, "警告", "用户名格式不正确"); 8 return; 9 }
注意,重新更换正则表达式时
1 regexp.setPattern(PHONE_REG);
3、将注册的信息转换成JSON格式字符数组;(具体操作,以往博客中有提到)
4、利用HTTP协议,把数据发送给服务器;
主要用到三个类QNetworkAccessManager、QNetworkRequst、QNetworkReply
QNetworkRequst负责设置URL、请求头信息。主要方法:setUrl() setHeader()
QNetworkAccessManager负责向服务发送数据,主要方法:post()
QNetworkReply负责接受服务器端发来的数据。
1 //初始化QNetworkAccessManager类对象; 2 QNetworkAccessManager *manager= new QNetworkAccessManager(this); 3 QNetworkRequest res; 4 //拼接URL,从控件中取出服务器端的IP和端口,后面“/reg”是指令,服务器拿到指令会找对应的fastcgi程序来解析 5 QString url = QString("http://%1:%2/reg").arg(ui->address_server->text()).arg(ui->port_server->text()); 6 request.setUrl(QUrl(url)); 7 //设置请求头 8 request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));//post方式提交的数据类型,这里是JOSN 9 request.setHeader(QNetworkRequest::ContentLengthHeader, QVariant(data.size()));//要发送数据的长度 10 //向服务器发送数据,reply接受从服务器返回的数据 11 QNetworkReply *reply= manager->post(res,data);
5、处理服务器的响应消息
服务器发来的是json对象,需要对json对象处理,取出里面的Value,判断是注册成功还是失败。
然后对用户做出提示。
服务器端的发回的json数据格式:
1 成功: {"code":"000"} 2 该用户已存在: {"code":"001"} 3 失败: {"code":"002"}
1 connect(reply, &QNetworkReply::readyRead, [=]() 2 { 3 // 读sever回写的数据 4 QByteArray jsonData = reply->readAll(); 5 // 解析服务器发来的数据,判断状态码 6 //做出相应提示 7 }
知道了客户端的处理流程,那么服务端怎么处理?
由于Nginx服务器只会处理静态请求,由客户端发来的注册请求,nginx服务器处理不了,它会把请求转发给fastcgi程序,fastcgi是运行在nginx服务上的一段程序。于是,我们可以通过修改nginx的配置文件,把客户端的请求发送给对应的程序处理。
1 location /reg{ 2 #服务器的地址和fastcgi程序运行的端口 3 fastcgi_pass 192.168.31.33:10001; 4 include fastcgi.conf; 5 }
fastcgi程序处理注册请求的流程
1、把客户端发送的数据包读到一个buf缓冲区中;
2、解析json数据包,获取客户端发送的用户名、密码、邮箱等信息,这里用到了cJSON的开源库,通过cJSON的API可以轻松解析JSON包;同理,获取密码和邮箱等信息也用同样的方法。
1 //解析一个json字符串为cJSON对象 2 cJSON * root = cJSON_Parse(buf); 3 //返回指定字符串对应的json对象 4 //获取用户名 5 cJSON *child1 = cJSON_GetObjectItem(root, "userName");
6 strcpy(user, child1->valuestring); //拷贝内容 这里的user是传出参数,把取来的用户名放在user变量中
3、读服务端的配置文件,获取数据库的用户名、密码、DB,然后通过API连接到数据库,查看该用户名是否存在,如果不存在,插入新的注册信息。
1 MYSQL *conn = NULL; //MYSQL对象句柄 2 //用来分配或者初始化一个MYSQL对象,用于连接mysql服务端 3 conn = mysql_init(NULL); 4 //连接到数据库 5 mysql_real_connect(conn, NULL, user_name, passwd, db_name, 0, NULL, 0); 6 //组织sql语句 7 sprintf(sql_cmd, "select * from user where name = '%s'", user); 8 //查询 9 mysql_query(conn, sql_cmd); 10 //生成结果集 11 MYSQL_RES *res_set=mysql_store_result(conn); 12 //mysql_num_rows接受由mysql_store_result返回的结果结构集,并返回结构集中的行数,如果line=0,说明没有记录,如果>0,表述有记录 13 line = mysql_num_rows(res_set);