我正在尝试完成SAS BI Web Services Developers Guide第19页上的示例。我已逐字按照说明操作,但在发出帖子请求时无法获取存储过程(自动为Web服务)以返回正确的结果。我正在尝试SOAP和XML。错误是永远找不到'instream'数据源。
我要求的是有人复制示例并使用post请求提供确切的XML和/或SOAP(以curl的形式)。
这是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>
我是通过curl发帖的。这是我的curl命令
curl -H "Content-Type: text/xml" -X POST https://mycompany.com:port/SASBIWS/services/WebServicesExamples/sampMeans --data "@sampmeanssoap.xml"
但这会产生错误
执行期间发生'客户'类型的异常 '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>
使用curl
curl -H "Content-Type: text/xml" -X POST https://mycompany.com:port/SASBIWS/rest/storedProcesses/WebServicesExamples/sampMeans --data-binary "@sampmeanssoap.xml"
我只能在使用参数时成功获取存储过程,但由于某种原因无法发送数据源。
答案 0 :(得分:4)
最后找到答案并将其发布到SAS社区(https://communities.sas.com/t5/SAS-Stored-Processes/Help-with-XML-Syntax-for-post-request-to-Stored-Process/m-p/239032/highlight/false#M3304)
不幸的是,文档非常缺乏通过纯XML发送数据流的具体示例。我最初只是尝试在文档的XMLA部分中插入单独的示例SOAP请求的纯XML部分,但无法找到我的流'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>
我需要为流,插播和价值提供单独的元素,据我所知,这在互联网上绝对没有。
这是完整的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>
这是实际存储的进程sas代码。它与开发人员的示例略有不同,因为没有_XMLSCHEMA宏变量。 (tablename默认为InData,但您可以使用<parameters>
和<parameter_name>
标记将其传递给XML
%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;