我正在尝试完成SAS BI Web服务开发人员指南第19页上的示例.我已逐字按照说明操作,但在发出帖子请求时无法获取存储过程(自动为Web服务)以返回正确的结果.我正在尝试SOAP和XML.错误是永远找不到'instream'数据源.
我要求的是有人复制示例并使用post请求(以curl的形式)提供确切的XML和/或SOAP.
这是SOAP(直接来自指南)
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:sas="urn:schemas-microsoft-com:xml-analysis">
<soapenv:Header/>
<soapenv:Body>
<sas:Execute>
<sas:Command>
<StoredProcess name="/WebServicesExamples/sampMeans">
<Parameter name="tablename">InData</Parameter>
<Stream name="instream">
<Table>
<InData>
<Column1>1</Column1>
<Column2>20</Column2>
<Column3>99</Column3>
</InData>
<InData>
<Column1>50</Column1>
<Column2>200</Column2>
<Column3>9999</Column3>
</InData>
<InData>
<Column1>100</Column1>
<Column2>2000</Column2>
<Column3>1000000</Column3>
</InData>
</Table>
</Stream>
</StoredProcess>
</sas:Command>
<sas:Properties>
<PropertyList>
<DataSourceInfo>Provider=SASSPS;</DataSourceInfo>
</PropertyList>
</sas:Properties>
</sas:Execute>
</soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)
我通过curl发帖.这是我的curl命令
curl -H "Content-Type: text/xml" -X POST https://mycompany.com:port/SASBIWS/services/WebServicesExamples/sampMeans --data "@sampmeanssoap.xml"
Run Code Online (Sandbox Code Playgroud)
但这会产生错误
在执行"WebServicesExamples/sampMeans"服务期间发生了"客户端"类型的异常.例外如下:未指定预期的流'instream'.
XML产生类似的响应
<StoredProcess name="/WebServicesExamples/sampMeans">
<Parameter name="tablename">InData</Parameter>
<Stream name="instream">
<Table>
<InData>
<Column1>1</Column1>
<Column2>20</Column2>
<Column3>99</Column3>
</InData>
<InData>
<Column1>50</Column1>
<Column2>200</Column2>
<Column3>9999</Column3>
</InData>
<InData>
<Column1>100</Column1>
<Column2>2000</Column2>
<Column3>1000000</Column3>
</InData>
</Table>
</Stream>
</StoredProcess>
Run Code Online (Sandbox Code Playgroud)
随着卷曲
curl -H "Content-Type: text/xml" -X POST https://mycompany.com:port/SASBIWS/rest/storedProcesses/WebServicesExamples/sampMeans --data-binary "@sampmeanssoap.xml"
Run Code Online (Sandbox Code Playgroud)
当仅使用参数但是由于某种原因无法发送数据源时,我可以成功地完成存储过程.
终于找到了答案并将其发布到 SAS 社区(https://communities.sas.com/t5/SAS-Stored-Processes/Help-with-XML-Syntax-for-post-request-to-Stored-Process /mp/239032/highlight/false#M3304 )
不幸的是,该文档非常缺乏通过纯 XML 发送数据流的具体示例。我最初尝试将单个示例 SOAP 请求的纯 XML 部分插入文档的 XMLA 部分,但无法找到我的流“instream”。
解决方案的关键是查看 wsdl 文件(只需将 ?wsdl 附加到端点。例如:https ://mycompany.com:port/SASBIWS/services/path/to/process/process_name?wsdl )我得到了一个简单的 addint 存储过程成功返回,并注意到在我的新存储过程中,wsdl 与开发人员指南中的示例不匹配。以下是流数据的存储过程的 wsdl 的相关部分。
<xsd:complexType name="upload_stream5Streams">
<xsd:sequence>
<xsd:element name="instream">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Value">
<xsd:complexType>
<xsd:sequence>
Run Code Online (Sandbox Code Playgroud)
我需要单独的流、内流和价值元素,据我所知,这在互联网上绝对是找不到的。
这是完整的 XML
<upload_stream5>
<streams>
<instream>
<Value>
<Table>
<InData >
<Column1>1</Column1>
<Column2>20</Column2>
<Column3>99</Column3>
</InData>
<InData>
<Column1>50</Column1>
<Column2>200</Column2>
<Column3>9999</Column3>
</InData>
<InData>
<Column1>100</Column1>
<Column2>2000</Column2>
<Column3>1000000</Column3>
</InData>
</Table>
</Value>
</instream>
</streams>
</upload_stream5>
Run Code Online (Sandbox Code Playgroud)
这是实际的存储过程 sas 代码。它与开发人员的示例有点不同,因为没有 _XMLSCHEMA 宏变量。(表名默认为 InData,但您可以使用 XML 以及使用<parameters>和<parameter_name>标签传递它)
%put &tablename;
libname otstream xml xmlmeta = SchemaData;
libname instream xml;
proc means data=instream.&tablename;
output out=otstream.mean;
run;
libname otstream clear;
libname instream clear;
Run Code Online (Sandbox Code Playgroud)