通过URL与数据库交互(十三)

一. 更改方式

之前项目是直接连接MySQL,现在先与服务器上脚本交互,再实现与数据库的交互。脚本使用PHP语言编写。

.php是PHP文件的扩展名,PHP是一种广泛使用的服务器端脚本语言,主要用于创建动态网页和Web应用程序。

下面这段PHP代码定义了一个用于操作MySQL数据库的类Mysqlmethod

属性:

  • protected $mysql_server_name:数据库服务器的主机名,这里设置为 localhost
  • protected $mysql_username:用于连接数据库的用户名,这里是 plantuser
  • protected $mysql_password:用于连接数据库的密码,这里是 plantpsw
  • protected $mysql_database:要连接的数据库名称,这里是 plantfactory
  • protected $mysql_conn:用于保存数据库连接的变量。

这个Mysqlmethod封装了连接MySQL数据库和执行SQL查询的基本操作,构造函数负责初始化数据库连接,析构函数确保在对象销毁时关闭数据库连接,防止连接泄露,dosqlad方法用于执行SQL查询,并返回查询结果或false

<?php
    /**
     * mysql method
     * mysql-action-sdk
     */

class Mysqlmethod
{
	protected $mysql_server_name='localhost';
	protected $mysql_username='plantuser';
	protected $mysql_password='plantpsw';
	protected $mysql_database='plantfactory';	
	protected $mysql_conn;
	
	public function __construct()
    {
		$this->mysql_conn=mysqli_connect($this->mysql_server_name,$this->mysql_username,$this->mysql_password,$this->mysql_database);
    }
	
	public function __destruct() 
	{
		if($this->mysql_conn)
		{                   
			mysqli_close($this->mysql_conn);
		}
	}
	
	public function dosqlad($sql)
	{
		if($this->mysql_conn)
		{                   
			$result = mysqli_query($this->mysql_conn,$sql);
			return $result;
		}
		return false;
	}
}
?>

二. python使用PHP提供的接口

import requests

DEVICEID = "14521d4b0142623100005c0000000000"
'''get box cmd api, if success, response is 200'''
#response=requests.get('http://www.deepplanting.com/box/api/get/getboxcmd/'+DEVICEID)
#print(response,response.text)


'''get box status api, if success, response is 200'''
#response=requests.get('http://www.deepplanting.com/box/api/get/getboxstatus/'+DEVICEID)
#print(response,response.text)


'''send sendboxcmd api, if success, response is 201'''
#params={'timestamp':122,'mode':0,'watering':0,'lighting':0,'ventilating':1,'heating':0,'warming':0,'cooling':1}
#response=requests.post('http://www.deepplanting.com/box/api/post/sendboxcmd/'+DEVICEID,json=params)
#print(response,response.text)


'''send sendboxstatus api, if success, response is 201'''
params={'timestamp':122,'temper':35.5,'humidity':21.1,'co2':0,'lux':1,'panpos':0,'waterpos':0}
response=requests.post('http://www.deepplanting.com/box/api/post/sendboxstatus/'+DEVICEID,json=params)
print(response,response.text)

三. QT使用PHP提供的接口

可以通过 **QNetworkAccessManager**类来发起 HTTP 请求。

3.1 发送GET请求

  • 创建一个 QUrl 对象,指定请求的 URL。
  • 创建一个 QNetworkRequest 对象,并设置请求的 URL。
  • 使用 QNetworkAccessManagerget 方法发送 GET 请求。
  • connect 语句将 QNetworkReply 对象的 finished 信号连接到 onGetFinished 槽函数,这样当 GET 请求完成时会调用 onGetFinished 方法处理响应。

3.2 发送POST请求

  • 创建一个 QUrl 对象,指定 POST 请求的 URL。
  • 创建一个 QNetworkRequest 对象,并设置请求的 URL。
  • 使用 setHeader 方法设置请求头 Content-Typeapplication/json,表示请求数据是 JSON 格式。

3.3 构建JSON数据

  • 使用 QJsonObject 创建 JSON 数据对象,并设置相应的键值对。
  • 创建一个 QJsonObject 对象 airCondition,设置其属性,并将其添加到主 jsonObject 中。
  • 使用 QJsonDocumentQJsonObject 转换为 JSON 文档。
  • 使用 toJson 方法将 JSON 文档转换为字节数组 postData,准备发送 POST 请求的数据。

3.4 发送Post请求

  • 使用 QNetworkAccessManagerpost 方法发送 POST 请求,并传递 JSON 数据。
  • QNetworkReply 对象的 finished 信号连接到 onPostFinished 槽函数,这样当 POST 请求完成时会调用 onPostFinished 方法处理响应。

在GET请求中,URL通常包含了请求的资源地址 ,而实际要传递给服务器的参数则通过URL中的查询字符串部分传递。

class MyNetworkManager : public QObjec
{
public:
    MyNetworkManager(QObject *parent = nullptr) : QObject(parent)
       {
           manager = new QNetworkAccessManager(this);

           // 示例:发送 GET 请求
           QUrl url("http://plant.alienhand.cn/open/v2/getstate/00000000dd22ffee");
           QNetworkRequest request(url);
           QNetworkReply *reply = manager->get(request);

           connect(reply, &QNetworkReply::finished, this, &MyNetworkManager::onGetFinished);

           // 示例:发送 POST 请求
           QUrl postUrl("http://plant.alienhand.cn/open/v2/sendcmd/00000000dd22ffee");
           QNetworkRequest postRequest(postUrl);
           postRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");

           QJsonObject jsonObject;
           jsonObject["led"] = 0;
           jsonObject["watering"] = 0;
           jsonObject["wind"] = 0;
           jsonObject["curtainS"] = true;
           jsonObject["curtainN"] = true;
           jsonObject["co2"] = false;
           jsonObject["pi"] = false;
           jsonObject["fert"] = false;
           jsonObject["phvalve"] = false;

           QJsonObject airCondition;
           airCondition["mode"] = 0;
           airCondition["temperature"] = 25;
           airCondition["isOn"] = true;
           jsonObject["aircondition"] = airCondition;

           QJsonDocument jsonDoc(jsonObject);
           QByteArray postData = jsonDoc.toJson();

           QNetworkReply *postReply = manager->post(postRequest, postData);

           connect(postReply, &QNetworkReply::finished, this, &MyNetworkManager::onPostFinished);
       }
private slots:
    void onGetFinished()
    {
        QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
        if (reply)
        {
            qDebug() << "GET response:" << reply->readAll();
            reply->deleteLater();
        }
    }

    void onPostFinished()
    {
        QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
        if (reply)
        {
            qDebug() << "POST response:" << reply->readAll();
            reply->deleteLater();
        }
    }
private:
    QNetworkAccessManager *manager;

};

四. 注意

要通过 HTTP 访问 PHP 文件,你需要将 PHP 文件放置在 Web 服务器能够访问的目录中,并确保 Web 服务器的配置正确。

.htaccess 文件包含了 URL 重写规则

[root@iZuf62h8v3r43nr8q9yb5tZ /]# vim ./var/www/deepplanting/web/.htaccess

# 开启 rewrite 功能
#Options +FollowSymlinks
RewriteEngine on

# 重写规则
RewriteRule ^box/api/get/([A-Za-z0-9]+)/([A-Za-z0-9]+)   box/api/v1/get.php?method=$1&sign=$2 [nc,qsa]
RewriteRule ^box/api/post/([A-Za-z0-9]+)/([A-Za-z0-9]+)   box/api/v1/post.php?method=$1&sign=$2 [nc,qsa]
~

也可以用nginx1.conf文件

  location /box/api/get/ {
        rewrite ^/box/api/get/([A-Za-z0-9]+)/([A-Za-z0-9]+)$ /box/api/v1/get.php?method=$1&sign=$2 last;
    }

    location /box/api/post/ {
        rewrite ^/box/api/post/([A-Za-z0-9]+)/([A-Za-z0-9]+)$ /box/api/v1/post.php?method=$1&sign=$2 last;
    }
相关推荐
黑客学长-刘备3 分钟前
终于有人把网络安全就业方向一口气讲清了(非常详细)零基础入门到精通,收藏这一篇就够了
java·运维·服务器·网络·python·安全·web安全
奔跑的小蜗牛哈哈4 分钟前
使用redis实现发布订阅功能及问题
数据库·redis·bootstrap
CSDN云计算4 分钟前
自然交互开启原生办公新时代 汉王科技发布全新MOUNTAIN系列手写办公本
科技·交互·汉王·原生办公
学习HCIA的小白4 分钟前
RHCE笔记-DNS服务器
运维·服务器·笔记
云卓科技7 分钟前
无人机之任务分配算法篇
科技·算法·机器人·无人机·交互·制造
clear code23 分钟前
【modbus协议】Modbus-TCP消息帧格式
服务器·网络协议·tcp/ip
柳鲲鹏26 分钟前
QT访问数据库:应用提示Driver not loaded
数据库
小沈熬夜秃头中୧⍤⃝31 分钟前
宝塔FTP服务配置结合内网穿透实现安全便捷的远程文件管理和传输
linux·服务器·安全
大G哥31 分钟前
MyBatis 源码分析 - SQL执行过程(三)之 ResultSetHandler
数据库·sql·microsoft·mybatis
abandondyy32 分钟前
NoSQL之 Redis配置与优化
数据库·redis·nosql