调用 REST API 以在票证系统中创建问题的 PHP 脚本只能调用一次

Posted

技术标签:

【中文标题】调用 REST API 以在票证系统中创建问题的 PHP 脚本只能调用一次【英文标题】:A PHP script that calls a REST API to create issues in a ticket system should only be called once 【发布时间】:2016-03-09 07:30:52 【问题描述】:

我有一个相当具体的问题。

我正在为我们公司的员工注册流程编写一个应用程序。在几个表格的过程中,收集有关新员工要求的数据并将其输入 mysql 数据库。

在最后一步中,一个 php 脚本获取这些信息,并通过 cURL 在我们的 JIRA 票证系统(通过 REST API)中创建多个票证。

执行 cURL 调用的网页也会在之后呈现结果,即指向已创建票证的链接。如果有人点击一个链接,然后决定按下浏览器的“返回”按钮,整个脚本将再次运行。

如何有效地防止这种情况发生?我已经有了一些想法,但它们似乎都不合适: - 在数据库中创建更多信息,即每张工单的状态,然后在决定运行 cURL 调用之前对其进行查询。 - 不允许通过 JS 按下后退按钮来访问脚本(实际上这个想法完全是垃圾,但无论如何我都会把它留在这里。) - 不允许用户调用脚本,而是让表单向我发送一封电子邮件,说明信息已输入,以便我自己运行脚本。每次...

对不起,这不是一个“确切”的问题,而是更多关于最佳实践的问题。虽然在我看来,这才是论坛所需要的,而不是你可以在任何文档中阅读的东西。

问候

【问题讨论】:

您可以使用标头将用户从执行 curl 请求的脚本(收到响应后)重定向到显示票证的页面 或者,由于您不能真正阻止用户使用浏览器历史记录来回移动,您可以在提交完成后设置一个会话值,如果该会话值存在,那么 curl 请求将不被处理,而是您可以显示与该会话值关联的任何记录 【参考方案1】:

只是一个想法 - 使用会话变量来确保 curl 请求只发生一次 - 您可以替代地(或与会话一起)在数据库中存储一个布尔值,针对他们的姓名/用户 ID 来指示他们已经完成了该过程。

<?php
    if( !isset( $_SESSION['curl_ticket'] ) )
        /* do the curl request */

        /* get response from request */

        /* set the session */
        $_SESSION['curl_ticket']=$some_id;
    


    if( isset( $_SESSION['curl_ticket'] ) )
        /* display ticket */    
    
?>

【讨论】:

看起来不错。实际上,“创建所有票证脚本已执行”这一事实我只需要数据库中的一个值。如果发生错误,我为管理员提供脚本,可以一一创建每​​张票。使用 DB 而不是 session 也可以确保脚本也不能被其他人执行,或者当同一个人在 session 过期后由于某种原因返回时。

以上是关于调用 REST API 以在票证系统中创建问题的 PHP 脚本只能调用一次的主要内容,如果未能解决你的问题,请参考以下文章

如何在Erlang中创建Json对象并在Rest Api中传递它

如何在 Laravel 中创建 RESTful API 以在我的 BackboneJS 应用程序中使用

如何从 Windows 控制台调用 .exe (C++) 以在不同目录(或任何目录)中创建文件夹?

如何使用 java rest api 在 jira 中创建问题

如何使用JSON正文在REST API POST方法中传递多个记录

如何使用 Rest API 在 Bitbucket Cloud 中创建项目?