如何在PHP中从CURL调用SAS存储过程?

时间:2018-08-16 22:11:04

标签: php curl sas sas-stored-process

我想构建一个Web应用程序,该应用程序调用SAS存储的过程并打印结果。我希望在后台处理身份验证。

该Web应用程序是用PHP内置的,我将使用CURL发出请求。

这可能吗?哪些CURL选项是必需的?

3 个答案:

答案 0 :(得分:4)

这样做的正确方法(考虑到安全性)是使用其票证API-您可以先通过PHP握手进行CURL请求,以最终获得STP端点的结果。

Step1a)POST请求... / SASLogon / v1 /票证,其中包含用户名和密码的表单编码有效载荷。

Step1b)查看响应标头“位置”(由“ /” [-1]分隔)以获取您的身份验证令牌。

Step2a)向同一第一个URL发出POST请求,并在末尾附加auth令牌,然后将服务URL(service = xxx)(理想情况下是... / SASStoredProcess)传递到正文(格式编码)中/ do)端点。

Step2b)解析响应正文以获取您的票证令牌。

Step3a)使用_program = STP终结点的POST有效负载(形式编码)对服务(... / do?token = [TicketToken])运行一个请求

Step3b)结果将是您请求的结果。

这可能需要一些特定的SAS安装配置,但需要进行常规的票据握手(通常是从内存中键入,而在我面前没有示例)。 SAS非常具体,具体取决于版本和所安装的软件。

您可以使用CURL实现此目的,但我个人认为我喜欢使用更高级别的请求库。

给出的其他答案都是有效的,但在后台进行身份验证,我认为您需要适当的安全性-在每个请求中传递用户名和密码都是安全隐患。在我看来,使用票务系统和握手将是一种“更好”的解决方案。

答案 1 :(得分:3)

首先请按照here中的说明,确保正确配置了存储过程的Web服务器。

创建一个包含以下代码的.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);   

?>

配置以下内容:

  • _username
  • _password
  • _program(在此示例中,我使用了SAS随附的示例)
  • CURLOPT_URL
  • CURLOPT_PORT
  • 根据您的网站架构,您可能需要其他CURL选项,但以上内容在大多数情况下就足够了

配置完成后,在浏览器的地址栏中输入.php文件的URL。您应该看到输出:

Hello World!

列出的PHP代码使用了工作所需的最少选项。它假定您可能还需要解析标头数据以确定结果的内容类型。

此外,在实施上述代码时,请确保所有用户凭据都安全存储。将用户凭据硬编码到源代码中(即使SAS密码已经通过PWENCODE运行)永远不是一个好主意。

答案 2 :(得分:2)

对于通用(非PHP,命令行)答案,这里是单行代码。

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

here所述,需要注意的事情包括:

1)使用cookie文件,以便可以通过SASLogon重定向写入会话令牌(-c),随后读取(-b)。

2)_username和_password参数用于验证(请参阅文档)

3)-v用于详细记录,-L告诉curl遵循重定向(SASLogon)位置