通过HTTPPOST将XML传递给Web服务

通过HTTPPOST将XML传递给Web服务,xml,http-headers,sas,Xml,Http Headers,Sas,我正在尝试向管理引擎RESTAPI(文档)提交一个XML字符串。我正在SAS中使用%http宏()执行此操作 我的发送/接收头如下所示(为简洁起见,采用XML非URL编码): 但是,此方法在URL为512个字符及以上时崩溃 是否有人有使用SAS向web服务提交长XML字符串的经验? 编辑:procHTTP(512个字符)限制似乎与SAS有关,因为我可以使用CURL通过URL成功提交更长的XML字符串。但是,如果可能的话,我们希望避免在服务器上使用命令行(x curl)..该html过程可以从fi

我正在尝试向管理引擎RESTAPI(文档)提交一个XML字符串。我正在SAS中使用%http宏()执行此操作

我的发送/接收头如下所示(为简洁起见,采用XML非URL编码):

但是,此方法在URL为512个字符及以上时崩溃

是否有人有使用SAS向web服务提交长XML字符串的经验?


编辑:procHTTP(512个字符)限制似乎与SAS有关,因为我可以使用CURL通过URL成功提交更长的XML字符串。但是,如果可能的话,我们希望避免在服务器上使用命令行(x curl)..

html
过程可以从
fileref
读取POST参数。可以在中找到一个示例。这将允许您将
url
选项保持在可接受的长度

一个粗略的例子是

/* Create fileref to store POST parameters */
filename in "/path/to/files/in.txt";
/* Create fileref to store http response */
filename out temp;

/* Write parameters to file */
data _null_;
   file in;
   input;
   put _infile_;
   datalines4;

&INPUT_DATA=<?xml version='1.0'?><Operation><Details> <subject>Test</subject></Details></Operation>
;;;;
run

/* Run the request */
proc http 
    in = in
    out = out 
    method = "POST"     
    url = "&MANAGE_ENGINE_URL/request?OPERATION_NAME=ADD_REQUEST%str(&)TECHNICIAN_KEY=&MANAGE_ENGINE_API_KEY"; 
run;
/*创建fileref以存储POST参数*/
文件名为“/path/to/files/in.txt”;
/*创建fileref以存储http响应*/
文件名输出温度;
/*将参数写入文件*/
数据为空;
归档;
输入
把"填入";;
数据线4;
&输入数据=测试
;;;;
跑
/*运行请求*/
过程http
in=in
out=out
method=“POST”
url=“&MANAGE\u ENGINE\u url/request?OPERATION\u NAME=添加请求%str(&)technology\u KEY=&MANAGE\u ENGINE\u API\u KEY”;
跑

您是否尝试过使用
in=
选项传递参数?用户指南中提供了一个示例。这应该可以避免在
url
选项上设置任何字符限制。@SRSwift-所以我刚刚尝试了in=方法(再次),它成功了!!最初我确实尝试过几次,但都没有成功,我想可能是因为在数据行中放入了编码(而不是原始)xml,还有其他原因。请随意将此作为实际答案写下来,以便我可以接受..没问题,很高兴它起了作用。我更新了一些小的更改,因为有一些无效的语法-但仍然是需要的-谢谢:-)
proc http out=out method="POST"     
   url="&MANAGE_ENGINE_URL/request?OPERATION_NAME=ADD_REQUEST%str(&)TECHNICIAN_KEY=&MANAGE_ENGINE_API_KEY%str(&)INPUT_DATA=%sysfunc(urlencode(&xml))" 
; run;
/* Create fileref to store POST parameters */
filename in "/path/to/files/in.txt";
/* Create fileref to store http response */
filename out temp;

/* Write parameters to file */
data _null_;
   file in;
   input;
   put _infile_;
   datalines4;

&INPUT_DATA=<?xml version='1.0'?><Operation><Details> <subject>Test</subject></Details></Operation>
;;;;
run

/* Run the request */
proc http 
    in = in
    out = out 
    method = "POST"     
    url = "&MANAGE_ENGINE_URL/request?OPERATION_NAME=ADD_REQUEST%str(&)TECHNICIAN_KEY=&MANAGE_ENGINE_API_KEY"; 
run;