通过执行本机操作系统的命令(如 curl)通过 MySQL 调用 HTTP GET 请求

Posted

技术标签:

【中文标题】通过执行本机操作系统的命令(如 curl)通过 MySQL 调用 HTTP GET 请求【英文标题】:Invoking an HTTP GET request through MySQL by executing native operating system's commands like curl 【发布时间】:2015-04-24 07:31:11 【问题描述】:

我正在使用在 32 位 Microsoft Windows XP(专业版 2002 Service Pack 3)上运行的 mysql 5.6.11。我安装了 MySQL sys_exec UDF。因为我在 32 位 Windows 上运行,所以我使用了这个 lib_mysqludf_sys.dll(放在 C:\Program Files\MySQL\MySQL Server 5.6\lib\plugin\ 下,因为它是默认安装)。

之后,执行以下命令(登录到已创建的数据库后)。

mysql> CREATE FUNCTION sys_exec RETURNS INT SONAME 'lib_mysqludf_sys.dll';
Query OK, 0 rows affected (0.02 sec)

我已经创建了一个 PL/SQL 存储过程,如下所示。

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `country_push`()
BEGIN 
    SET @result=sys_exec('curl http://localhost:8080/ContextPath/push-update-country'); 
END

此过程应该由数据库触发器调用(已充分完成),因此,当执行此存储过程时,它应该在所述 URL 上引发 HTTP GET 请求,但不会在 URL 上引发 HTTP GET 请求通过某个事件的触发器。


在命令行手动执行过程也成功,如下。

mysql> CALL country_push();
Query OK, 0 rows affected (0.08 sec)

sys_exec() 函数返回1 如下这是一个成功标志

mysql> SELECT sys_exec('curl http://localhost:8080/ContextPath/push-update-country')
AS result;
+--------+
| result |
+--------+
|      1 |
+--------+
1 row in set (0.06 sec)

GlassFish (4.1) 应用程序服务器上已经运行了一个 Java Servlet,它应该按如下方式监听这个 HTTP GET 请求。

@WebServlet(name = "PushCountry", urlPatterns = "/push-update-country")
public class PushCountry extends HttpServlet 

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        System.out.println("PushCountry called.");
    

doGet() 方法中的System.out.println("PushCountry called."); 行在服务器终端上没有任何结果(因为它没有被执行/调用),当上述 MySQL 的东西付诸实践时。

使用 MySQL 执行此操作是否不切实际,是否还有其他我可能遗漏的东西,或者它是旧的 EOL 恐龙:Windows XP?


我使用的共享动态链接库可能不合适。请澄清,如果这种情况超出了我的范围。


编辑:

进入时,

mysql> SELECT sys_eval('id');

MySQL 终止/崩溃并报告 following 错误报告。

关闭此对话框后,MySQL 会留下以下错误消息。

ERROR 2013 (HY000): 查询期间丢失与 MySQL 服务器的连接

它无法重新连接,直到/除非系统本身重新启动。

也许,我稍后会考虑重新安装操作系统本身。

【问题讨论】:

sys_exec() 函数返回 1 如下,这是一个成功标志。 你确定吗?返回值似乎是进程的退出状态,任何非零都意味着错误——不是成功。如果您使用sys_eval() 函数,您会得到什么响应?也许是有用的错误消息? 回复SELECT sys_eval('id');有错误。突然出现一个弹窗提示:mysqld.exe has encountered a problem and needs to close. We are sorry for the inconvenience. 关闭此对话框时,在命令行上提示此消息ERROR 2013 (HY000): Lost connection to MySQL server during query。 MySQL 永远停止工作,直到系统本身重新启动。 哎呀,服务器崩溃...好吧,这不是我想到的那种错误消息。 【参考方案1】:

似乎 'id' 是 Windows 下不存在的 Linux 命令... 无论如何,我在返回数字但没有启动进程的 Windows 下也遇到了 sys_exec() 的问题。 有关信息,它在 linux 下运行良好。

【讨论】:

欢迎来到 ***。你介意稍微扩展你的答案来解释它是如何解决问题的吗? lib_mysqludf_sys.dll 不够确定,但它在 Windows 上不可靠。

以上是关于通过执行本机操作系统的命令(如 curl)通过 MySQL 调用 HTTP GET 请求的主要内容,如果未能解决你的问题,请参考以下文章

使用curl命令操作elasticsearch

curl 安装

通过python自动生成curl的调用命令

通过python自动生成curl的调用命令

通过python自动生成curl的调用命令

Windows下怎么使用curl命令