通过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;
    }
相关推荐
诚信爱国敬业友善11 分钟前
GUI编程(window系统→Linux系统)
linux·python·gui
sekaii12 分钟前
ReDistribution plan细节
linux·服务器·数据库
焱焱枫1 小时前
自适应SQL计划管理(Adaptive SQL Plan Management)在Oracle 12c中的应用
数据库·sql·oracle
2301_793069821 小时前
Spring Boot +SQL项目优化策略,GraphQL和SQL 区别,Spring JDBC 等原理辨析(万字长文+代码)
java·数据库·spring boot·sql·jdbc·orm
YH_DevJourney1 小时前
Linux-C/C++《C/8、系统信息与系统资源》
linux·c语言·c++
hhw1991121 小时前
spring boot知识点5
java·数据库·spring boot
一小路一1 小时前
Go Web 开发基础:从入门到实战
服务器·前端·后端·面试·golang
威哥爱编程1 小时前
Linux驱动开发13个实用案例
linux
ITPUB-微风2 小时前
功能开关聚合对象实践:提升金融领域的高可用性
网络·数据库·金融
去看日出2 小时前
Linux(centos)系统安装部署MySQL8.0数据库(GLIBC版本)
linux·数据库·centos