通过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; }

相关推荐
Eternity......2 分钟前
spark MySQL数据库配置
数据库·mysql·spark
Freedom℡3 分钟前
使用scp命令拷贝hadoop100中文件到其他虚拟机中
数据库·hadoop·spark
Qdgr_6 分钟前
电厂除灰系统优化:时序数据库如何降低粉尘排放
数据库·时序数据库
水水沝淼㵘12 分钟前
嵌入式开发学习日志(数据结构--顺序结构单链表)Day19
linux·服务器·c语言·数据结构·学习·算法·排序算法
愚润求学19 分钟前
【Linux】基础 IO(一)
linux·运维·服务器·开发语言·c++·笔记
慧一居士27 分钟前
Memcached 服务搭建和集成使用的详细步骤示例
数据库·架构·nosql·memcached
脑子慢且灵32 分钟前
MySQL:关系模型的基本理论
数据库·sql·mysql
码农飞哥37 分钟前
互联网大厂Java求职面试实战:Spring Boot与微服务场景深度解析
java·数据库·spring boot·安全·微服务·消息队列·互联网医疗
Ai 编码助手43 分钟前
可视化+智能补全:用Database Tool重塑数据库工作流
数据库
敲上瘾1 小时前
MySQL基本查询
数据库·mysql·数据库开发·数据库架构·数据库系统