通过 http POST 将 XML 传递给 Web 服务

Passing XML to Web Service via http POST

我正在尝试 POST 向管理引擎 REST XML 提交一个字符串 API(文档 here). I am doing this in SAS using the %http macro (Garth Helf)。

我的发送/接收headers如下(XMLnon-urlencoded为了简洁):

>>> HTTP Request:
POST /sdpapi/request?OPERATION_NAME=ADD_REQUEST&TECHNICIAN_KEY=666-666-666 HTTP/1.1
Host: DEV-SDPLUS
Content-Length: 101
Connection: Close

&INPUT_TYPE=<?xml version='1.0'?><Operation><Details> <subject>Test</subject></Details></Operation>

<<< HTTP Response:
HTTP/1.1 200 OK
Set-Cookie: JSESSIONID=FFE99B5C995093265402E5F54A09A056; Path=/
X-Powered-By: Servlet 2.4; Tomcat-5.0.28/JBoss-3.2.6 (build: CVSTag=JBoss_3_2_6 date=200410140106)
Content-Type: text/xml;charset=UTF-8
Content-Length: 135
Date: Mon, 23 Mar 2015 12:00:59 GMT
Server: Apache-Coyote/1.1
Connection: close

<operation name="ADD_REQUEST"><result><status>Failed</status><message>No input data for creating request</message></result></operation>

当通过 url 提交时,XML 工作正常(返回 workorderid):

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;

然而,此方法因 URLS 512 及以上字符而失效。

有没有人有使用 SAS 向 Web 服务提交长 XML 字符串的经验?

编辑:proc http(512 个字符)限制似乎与 SAS 相关,因为我可以使用 C[=36 通过 URL 成功提交更长的 XML 字符串=].但是,我们希望尽可能避免在服务器上使用命令行 (x curl)..

html 过程可以从 fileref 读取 POST 参数。可以在 user guide 中找到示例。这将允许您将 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;