Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
验证Informix 4GL程序中的URL_Url_Informix_4gl - Fatal编程技术网

验证Informix 4GL程序中的URL

验证Informix 4GL程序中的URL,url,informix,4gl,Url,Informix,4gl,在我的Informix 4GL程序中,我有一个输入字段,用户可以在其中插入URL,然后通过脚本将提要发送到web。 如何在输入时验证URL,以确保它是一个实时链接?我能打个电话看看有没有错吗 I4GL正在检查URL 没有内置的函数可以做到这一点(I4GL发明时URL并不存在,还有其他一些东西) 如果您可以设计一个C方法来实现这一点,那么您可以安排通过C接口调用该方法。您将使用本机C编写该方法,然后使用常规规则编写一个I4GL可调用C接口函数。当您使用I4GL c代码构建程序时,您还将链接额外的c

在我的Informix 4GL程序中,我有一个输入字段,用户可以在其中插入URL,然后通过脚本将提要发送到web。 如何在输入时验证URL,以确保它是一个实时链接?我能打个电话看看有没有错吗

I4GL正在检查URL 没有内置的函数可以做到这一点(I4GL发明时URL并不存在,还有其他一些东西)

如果您可以设计一个C方法来实现这一点,那么您可以安排通过C接口调用该方法。您将使用本机C编写该方法,然后使用常规规则编写一个I4GL可调用C接口函数。当您使用I4GL c代码构建程序时,您还将链接额外的c函数。如果使用I4GL-RDS(p代码)构建程序,则需要构建一个自定义运行程序,并公开额外的函数。所有这些都是I4GL的标准技术

一般来说,您需要的C接口代码大致如下:

#include <fglsys.h>

// Standard interface for I4GL-callable C functions
extern int i4gl_validate_url(int nargs);

// Using obsolescent interface functions
int i4gl_validate_url(int nargs)
{
    if (nargs != 1)
        fgl_fatal(__FILE__, __LINE__, -1318);
    char url[4096];
    popstring(url, sizeof(url));
    int r = validate_url(url);     // Your C function
    retint(r);
    return 1;
}
DEFINE url CHAR(256)
DEFINE rc  INTEGER

LET url = "http://www.google.com/"
LET rc = i4gl_validate_url(url)

IF rc != 0 THEN
    ERROR "Invalid URL"
ELSE
    MESSAGE "URL is OK"
END IF
或者沿着这些一般路线。具体返回什么值取决于您关于如何从
validate\u url()
返回状态的决定。如果需要,您可以从接口函数返回多个值(例如错误号和错误消息文本)。这是调用一些C代码来验证I4GL程序中URL的最简单设计

现代C接口函数 接口库中的函数名在00年代中期全部更改,尽管旧名称仍然作为宏存在。旧名称是:

  • popstring(char*buffer,int-buflen)
  • retint(int-retval)
  • fgl\u致命(常量字符*文件,int行,int errnum)
您可以在中找到修订的文档,并且需要附录C“将C与IBM Informix 4GL结合使用”

新名称开始于ibm\u lib4gl\u:

  • ibm\u libi4gl\u popMInt()
  • ibm\u libi4gl\u popString()
至于错误报告功能,有一个-它存在-但我再也无法访问它的文档。它将出现在
fglsys.h
标题中。它将错误号作为一个参数;还有文件名和行号作为其他参数。它大概是
ibm\u lib4gl\u…
,名字的其余部分可能是
Fatal
或者
Fatal
(或者
Err
或者
Err

I4GL运行检查URL的脚本
写一个shell脚本来获取状态码不是更容易吗?如果我可以将状态代码或任何现有结果返回到程序的变量中,这可能会起作用?我可以这样做吗


很可能。但是,如果您希望URL的内容是字符串,那么最终可能需要调用C。当然,值得考虑的是,从I4GL中调用shell脚本是否可行。如果是这样,它会简单得多(
运行“script”
,IIRC,其中文字字符串可能会被包含命令和URL的内置字符串替换)。我相信I4GL中现在也有文件I/O函数,所以如果您可以让脚本编写一个文件(很简单),您就可以从文件中读取数据,而不需要自定义C。很长一段时间以来,您都需要自定义C来完成这项工作


我只需要在将URL存储到数据库之前验证它。我在想:

#!/bin/bash

read -p "URL to check: " url
if curl --output /dev/null --silent --head --fail "$url"; then
    printf '%s\n' "$url exist"
else
    printf '%s\n' "$url does not exist"
fi
但是我只需要将输出而不是
/dev/null
放入变量中。我认为唯一的选择是将输出转储到一个临时文件中并从中读取


与其让I4GL运行代码来验证URL,不如让I4GL运行脚本来验证URL。使用脚本的退出状态,将
curl
的输出转储到
/dev/null

FUNCTION check_url(url)

    DEFINE url VARCHAR(255)
    DEFINE command_line VARCHAR(255)
    DEFINE exit_status  INTEGER

    LET command_line = "check_url ", url
    RUN command_line RETURNING exit_status

    RETURN exit_status

END FUNCTION {check_url}
您的呼叫代码可以分析退出状态以查看它是否工作。值为0表示成功;非零表示某种类型的问题,可以认为“URL不工作”

确保
检查url
脚本(a)在成功时状态为零,在任何类型的失败时状态为非零,并且(b)默认情况下不向标准输出(或标准错误)写入任何内容。写入标准错误或输出将破坏屏幕布局等,您不希望这样。(显然,您可以为脚本提供启用标准输出的选项,也可以使用选项调用脚本以抑制标准输出和标准错误,或者将输出重定向到
/dev/null
;但是,当I4GL程序使用时,它应该是静默的。)

您的“脚本”(
检查url
)可以简单到:

这会将第一个参数传递给
curl
,如果没有给出参数,则传递不存在的
example.com
URL,并将其自身替换为
curl
,从而根据需要生成零/非零退出状态。您可以将
2>/dev/null
添加到命令行的末尾,以确保看不到错误消息。(请注意,如果出现任何错误,调试将非常困难;请确保您已准备好调试。)

exec
是一个小优化;你可以省略它,结果几乎没有差别。(我可以设计一个可能会发现差异的方案;它涉及到向
curl
进程发送信号,尽管-
kill-9999
或类似,其中
9999
curl
进程的PID,并且没有实际意义。)

假设脚本只是调用另一个程序的一行代码,那么就有可能将所有代码嵌入I4GL程序中。然而,拥有一个外部shell脚本(或Perl脚本,或…)具有灵活性的优点;例如,您可以编辑它来记录尝试,而无需更改I4GL代码。多分发一个文件,但灵活性更好-
#!/bin/bash

exec curl --output /dev/null --silent --head --fail "${1:-http://www.example.com/"
IMPORT com
MAIN

    -- Should succeed and display 1
    DISPLAY validate_url("http://www.google.com")
    DISPLAY validate_url("http://www.4js.com/online_documentation/fjs-fgl-manual-html/index.html#c_fgl_nf.html") -- link to some of the features added to I4GL by Genero

    -- Should fail and display 0
    DISPLAY validate_url("http://www.google.com/testing")
    DISPLAY validate_url("http://www.google2.com")
END MAIN

FUNCTION validate_url(url)
DEFINE url STRING
DEFINE req com.HttpRequest
DEFINE resp com.HttpResponse

    -- Returns TRUE if http request to a URL returns 200
    TRY
        LET req = com.HttpRequest.create(url)
        CALL req.doRequest()
        LET resp = req.getResponse()
        IF resp.getStatusCode() = 200 THEN
            RETURN TRUE
        END IF
        -- May want to handle other HTTP status codes
    CATCH
        -- May want to capture case if not connected to internet etc
    END TRY
    RETURN FALSE 
END FUNCTION