代码之家  ›  专栏  ›  技术社区  ›  Robert Penridge

如何从PHP中的CURL调用SAS存储进程?

  •  0
  • Robert Penridge  · 技术社区  · 7 年前

    web应用程序是用PHP构建的,我将使用CURL发出请求。

    这可能吗?需要哪些卷曲选项?

    3 回复  |  直到 7 年前
        1
  •  4
  •   o43    7 年前

    要做到这一点(考虑到安全性),正确的方法是使用他们的ticket API——您可以首先使用PHP和握手来执行CURL请求,最终得到STP端点的结果。

    步骤1a)POST-request…/SASLogon/v1/tickets,表单编码的有效载荷为用户名和密码。

    步骤2a)向同一个第一个url发出POST请求,并在末尾附加auth令牌,然后在body(表单编码)中传递服务url(service=xxx)(理想情况下是…/sasstoredprocesss/do)端点。

    步骤2b)分析票证令牌的响应体。

    步骤3A)运行对服务的请求(the…/do?token=[TicketToken]),后有效载荷(形式编码)为_program=STP endpoint

    这可能需要一些特定的SAS安装配置设置,但这是一般的票证握手(通常是从内存中键入,而不是前面的示例)。SAS是非常具体的取决于版本和你的安装是什么。

    您可以使用CURL实现这一点,但在我个人看来,我喜欢使用更高级别的请求库。

    给出的其他答案都是有效的——但是我假设您需要一个适当的安全级别——在每个请求中传递用户名和密码是一个安全风险。在我看来,使用票务系统和握手是一种“更好的”形式解决方案。

        2
  •  3
  •   Robert Penridge    7 年前

    首先,按照位于 here .

    创建包含以下代码的.php文件。

    <?php
    
      $parameters = array('_program'  => '/Products/SAS Intelligence Platform/Samples/Sample: Hello World',  // PATH TO STORED PROCESS
                          '_username' => 'mysasusername',
                          '_password' => '{SAS002}EFC0A34D034F489E2E0E03E840D324D6D30964A3', // ENCODED PASSWORD FROM PROC PWENCODE
                          'myParam1'  => 'abc',
                          'myParam2'  => 123
                         );
    
      //
      // CREATE A NEW CURL INSTANCE AND CONFIGURE IT
      //  
      $ch = curl_init(); 
      curl_setopt($ch, CURLOPT_URL, "http://sas.myserver.com/SASStoredProcess/do?");
      curl_setopt($ch, CURLOPT_PORT, 7980);  // PORT USED TO MAKE STORED PROCESS REQUESTS
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // DISABLE SSL CERTIFICATE CHECKING - OPTIONAL DEPENDING ON SERVER CERTIFICATE
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // DISABLE SSL CERTIFICATE CHECKING - OPTIONAL DEPENDING ON SERVER CERTIFICATE
    
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // STORED PROCESS LOGIN INVOLVES MULTIPLE PAGE REQUESTS
      curl_setopt($ch, CURLOPT_COOKIEFILE, ""); // STORED PROCESS LOGIN REQUIRES COOKIES 
      curl_setopt($ch, CURLOPT_COOKIEJAR, ""); // STORED PROCESS LOGIN REQUIRES COOKIES
      curl_setopt($ch, CURLOPT_HEADER, true);  // DONT SUPPRESS HTTP HEADER INFO 
    
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); // SUPPRESS DIRECTLY PRINTING RESULTS WHEN CURL_EXEC IS RUN.
      curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,90); // TIMEOUT LIMIT WHILE TRYING TO CONNECT
      curl_setopt($ch, CURLOPT_TIMEOUT, 90); // TIMEOUT WHILE WAITING FOR RESPONSE
      curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parameters)); // SET THIS OPTION LAST.  MUST USE HTTP_BUILD_QUERY CALL ELSE YOU WILL BE PRESENTED WITH LOGIN PAGE
    
      //
      // EXECUTE IS AND SAVE THE RESULTS THEN CLOSE THE CURL OBJECT
      //    
      $response = curl_exec($ch) ; 
    
      // 
      // PARSE OUT THE HTTP HEADER VS THE BODY
      //
      $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
      $header = substr($response, 0, $header_size);
      $body = substr($response, $header_size);  
    
      print $body;
    
      curl_close($ch);   
    
    ?>
    

    • _用户名
    • _程序(在本例中,我使用了SAS附带的示例)
    • CURLOPT_网址
    • 根据您的站点架构,您可能需要额外的CURL选项,但是上面的选项应该足以满足大多数情况

    Hello World!
    

    列出的PHP代码使用了工作所需的最少选项。它假设在某个时刻,您可能还希望分析头数据以确定结果的内容类型。

    另外,在实现上述代码时,请确保安全地存储了所有用户凭据。将用户凭据硬编码到源代码中(即使SAS密码已通过pwcode运行)从来都不是一个好主意。

        3
  •  2
  •   Allan Bowe    7 年前

    对于一般的(非php,命令行)答案,这里是一行。

    curl -v -L -c cookiefile -b cookiefile \ 
        -d "_program=$STP&_username=$USERNAME&_password=$PASSWORD" \
        https://yourdomain.com/SASStoredProcess/do
    

    如前所述 here ,注意事项包括:

    2) 用户名和密码参数用于验证(参见文档)

    3) -v表示详细日志,-L表示curl遵循重定向(SASLogon)位置

    推荐文章