首页 > 编程语言 >PROC HTTP 实现自动下载宏程序依赖

PROC HTTP 实现自动下载宏程序依赖

时间:2024-01-05 21:59:28浏览次数:38  
标签:predpc multi HTTP url quantify sas PROC 宏程序

问题引出

我有时候会针对一些具体的场景编写很多宏程序,为了防止单个宏程序过于臃肿,会将重复的代码进行抽取,封装成一个个独立的程序单元。这其实有点类似面向对象中的基类,其他程序都在这些基类上进一步衍生,形成适用不同场景的宏程序。

举个例子,我写了一个宏 %quantify_multi_test,它调用了另一个宏 %quantify_multi,这个宏又调用了 %quantify,到此为止,%quantify 就是这条调用链中最底层的宏了。我必须事先导入后面两个宏程序,才能正确运行 %quantify_multi_test。人都是懒惰的,有没有什么办法在调用 %quantify_multi_test 的时候自动导入所需依赖呢?

如何实现

实现这一操作的前提是,需要将依赖程序的路径固定,本地存储肯定不行,可以借助 Github 将代码托管在网络上,并获取宏程序文件的固定链接。然后通过 SAS 提供的 PROC HTTP 过程自动下载固定链接的内容,使用 %incldue 语句导入依赖程序。

例如:

filename predpc "quantify_multi.sas";
%let url = %str(https://raw.githubusercontent.com/Snoopy1866/Descriptive-Statistics-Macro/main/gbk/quantify_multi.sas);
proc http url = "url" out = predpc;
run;

url 填写的是依赖程序的下载链接。注意:这里并不是 quantify_multi.sas 文件在 Github 仓库中的路径,需要在对应页面点击 RAW 按钮,然后复制地址栏的链接。

out = predpc 表示将下载好的文件保存为 predpc 指向的路径,这里的路径是由 filename 语句定义的,quantify_multi.sas 被存储在当前目录下。

获得 HTTP 响应状态

PROC HTTP 仅仅是帮助我们向远程主机发出了下载依赖程序的指令,我们仍然需要进一步判断是否下载成功,如果下载失败,程序应当提前终止,并输出提示信息。

PROC HTTP 提供了两个宏变量:

  • SYS_PROCHTTP_STATUS_CODE : 存储的是 HTTP 请求的状态码
  • SYS_PROCHTTP_STATUS_PHRASE : 存储的是有关 HTTP 请求的状态码的描述信息

需要注意的是:HTTP 请求成功发出后,上述两个宏变量才会被创建;如果 HTTP 请求没有成功发出,以上两个宏变量都不会被创建。

因此可以编写下面的代码,判断是否下载成功:

%if %symexist(SYS_PROCHTTP_STATUS_CODE) %then %do;
    %if &SYS_PROCHTTP_STATUS_CODE = 200 %then %do;
        %include predpc;
    %end;
    %else %do;
        %put ERROR: 远程主机连接成功,但并未成功获取目标文件,请手动导入前置依赖 %nrbquote(%nrstr(%%))QUANTIFY_MULTI 后再次尝试运行!;
        %goto exit_with_error;
    %end;
%end;
%else %do;
    %put ERROR: 远程主机连接失败,请检查网络连接和代理设置,或手动导入前置依赖 %nrbquote(%nrstr(%%))QUANTIFY_MULTI 后再次尝试运行!;
    %goto exit_with_error;
%end;

&SYS_PROCHTTP_STATUS_CODE = 200 表示 HTTP 请求成功,由于默认的方法是 GET,因此表示资源已被提取并在消息正文中传输。因此可以使用 %include 语句导入依赖程序。

设置代理

可以通过两种方法设置代理。

使用 PROXYHOST 和 PROXYPORT 选项

filename predpc "quantify_multi.sas";
%let url = %str(https://raw.githubusercontent.com/Snoopy1866/Descriptive-Statistics-Macro/main/gbk/quantify_multi.sas);
proc http url = "&url" out = predpc
          proxyhost = "127.0.0.1"
          proxyport = 7890;
run;

使用自动宏变量 PROCHTTP_PROXY

%let PROCHTTP_PROXY = 127.0.0.1:7890;
filename predpc "quantify_multi.sas";
%let url = %str(https://raw.githubusercontent.com/Snoopy1866/Descriptive-Statistics-Macro/main/gbk/quantify_multi.sas);
proc http url = "url" out = predpc;
run;

参考链接

HTTP 状态码速查

标签:predpc,multi,HTTP,url,quantify,sas,PROC,宏程序
From: https://www.cnblogs.com/snoopy1866/p/17948162

相关文章

  • do_fork-->copy_process(二)
     1/*2*Thiscreatesanewprocessasacopyoftheoldone,3*butdoesnotactuallystartityet.4*5*Itcopiestheregisters,andalltheappropriate6*partsoftheprocessenvironment(aspertheclone7*flags).Theac......
  • 详解HTTP 和 HTTPS:差异与应用
    网络安全问题正变得日益重要,而HTTP认识HTTP与HTTPSHTTP的工作原理HTTP,全称超文本传输协议,是用于传递网站信息的协议。当用户在网页上发起一个动作时,比如点击链接,浏览器就启动一个到服务器的请求过程。简化步骤如下:用户发起请求,浏览器编排出一个包涵动作类型(GET、POST服务器接......
  • Go语言中的HTTP服务器性能优化
    在当今的互联网时代,高性能的HTTP服务器是至关重要的。Go语言,以其并发特性和简洁的语法,成为了构建高效服务器的理想选择。本文将探讨如何优化Go语言中的HTTP服务器性能。首先,让我们理解性能优化的重要性。随着Web应用的复杂性和数据量的增长,对服务器的要求也越来越高。延迟、吞吐量......
  • 使用Go语言的HTTP客户端进行并发请求
    Go语言是一种高性能、简洁的编程语言,它非常适合用于构建并发密集型的网络应用。在Go中,标准库提供了强大的HTTP客户端和服务器功能,使得并发HTTP请求变得简单而高效。首先,让我们了解为什么需要并发HTTP请求。在许多应用场景中,我们可能需要同时向多个URL发起请求,例如同时获取多个页面......
  • 在Go语言中处理HTTP请求中的Cookie
    在Web开发中,Cookie是一种常用的技术,用于在客户端存储数据,并在随后的请求中发送回服务器。Go语言的标准库提供了强大的支持来处理HTTP请求中的Cookie。首先,让我们了解如何在Go语言中设置Cookie。以下是一个简单的示例,演示如何在HTTP响应中设置一个名为sessionID的Cookie:go复制代码pa......
  • Go语言中的HTTP头信息处理
    在Web开发中,HTTP头信息扮演着至关重要的角色。它们提供了关于HTTP请求和响应的元数据,如内容类型、缓存控制、认证信息等。Go语言,作为一种高效且强大的编程语言,提供了丰富的标准库来处理HTTP头信息。首先,我们需要了解HTTP头信息的基本结构。在Go的net/http包中,HTTP请求和响应都包含......
  • 前端歌谣-第四拾九课-node之http模块之fs模块
    前言我是歌谣微信公众号关注前端小歌谣一起学习前端知识今天继续给大家讲解node中fs模块的讲解创建文件constfs=require("fs")fs.mkdir("./geyao",(err)=>{console.log(err)if(err&&err.code==="EEXIST"){console.log("目录已经存在")}})运行结果重命......
  • 前端歌谣-第五十课-node之http模块之fs模块(续)
    前言我是歌谣微信公众号关注前端小歌谣一起学习前端知识今天继续给大家讲解node中fs模块的讲解同步创建constfs=require("fs")fs.mkdirSync("./geyao1",(err)=>{console.log(err)if(err&&err.code==="EEXIST"){console.log("目录已经存在")}})运行......
  • 使用Go语言编写高效的HTTP服务器
    随着互联网的快速发展,HTTP服务器在Web开发中扮演着越来越重要的角色。而Go语言作为一种高效、并发性强的编程语言,为编写高性能的HTTP服务器提供了强大的支持。本文将探讨如何使用Go语言编写高效的HTTP服务器。首先,我们需要了解Go语言的HTTP模块。Go语言的标准库中提供了net/http包,......
  • Go语言中的HTTP请求和响应处理
    在Web开发中,HTTP请求和响应是核心的交互方式。Go语言,作为一种高效且现代的编程语言,为开发者提供了简洁、强大的工具来处理HTTP请求和响应。本文将简要介绍在Go语言中如何处理HTTP请求和响应。在Go语言中,HTTP请求和响应的处理主要依赖于net/http包。这个包为开发者提供了发送HTTP请......