通过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;
    }
相关推荐
Rain_Rong15 分钟前
linux检测硬盘
linux·运维·服务器
过过过呀Glik18 分钟前
在 Ubuntu 上安装 Muduo 网络库的详细指南
linux·c++·ubuntu·boost·muduo
我曾经是个程序员40 分钟前
鸿蒙学习记录之http网络请求
服务器·学习·http
真真-真真1 小时前
WebXR
linux·运维·服务器
指尖上跳动的旋律1 小时前
shell脚本定义特殊字符导致执行mysql文件错误的问题
数据库·mysql
轩辰~2 小时前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
一勺菠萝丶2 小时前
MongoDB 常用操作指南(Docker 环境下)
数据库·mongodb·docker
wanhengidc2 小时前
短视频运营行业该如何选择服务器?
运维·服务器
m0_748244832 小时前
StarRocks 排查单副本表
大数据·数据库·python
雨中rain2 小时前
Linux -- 从抢票逻辑理解线程互斥
linux·运维·c++