我在shell脚本curl
中使用curlerWS.sh
调用来连接SOAP,REST和RESTful Web服务。我目前遇到的问题是SOAP调用,特别是连接到Sharepoint端点,从java 调用脚本时。
curlerWS.sh
按预期工作。它从sharepoint返回预期的XML响应。
它调用的curl
命令也可以在主shell中以交互方式工作。
但是,当我使用相同的参数从java类(在上述shell调用的同一服务器上运行Tomcat)中调用curlerWS.sh
时,curl返回curl: (7) couldn't connect to host
此调用过去曾与其他当前用于维护的sharepoint端点一起工作。
我相信我已经排除了代理人。当我在ProcessBuilder
中明确设置代理时,我从代理服务器收到错误,指的是错误地使用它来访问内部站点。
脚本中的curlerWS.sh
调用:
curlerWS.sh -X -s https://host.domain/sites/site/subsite/_vti_bin/Lists.asmx \
-f "studies.xml" \
-u "domain\user" \
-p pass \
-a ntlm \
-q '<GetListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/"><listName>{FAC53F9A-F7DC-4511-A675-F23B479C87CB}</listName><viewName></viewName><query></query><viewFields></viewFields><rowLimit>0</rowLimit><queryOptions><QueryOptions></QueryOptions></queryOptions></GetListItems>' \
-t http://schemas.microsoft.com/sharepoint/soap/GetListItems
curl
中的curlerWS.sh
来电:
curl \
-s \
"$DEBUG" \ # -v
--show-error \
-k \
--$AUTH \ # --ntlm
-A "basic" \
-u "$USER:$PASS" \
$FILE \ # -o output
-H "Content-Type: text/xml; charset=utf-8" \
-H "SOAPAction: $ACTION" \
-d "$DATA" \ #<?xml ...><soapenv:Envelope...>...</soapenv:Envelope>
"$SOURCE"
命令行上的curl
调用:
curl -s -v --show-error -k --ntlm -A "basic" -u "domain\user:pass" -o studies.xml -H "Content-Type: text/xml; charset=utf-8" -H "SOAPAction: http://schemas.microsoft.com/sharepoint/soap/GetListItems" -d '<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><GetListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/"><listName>{FAC53F9A-F7DC-4511-A675-F23B479C87CB}</listName><viewName></viewName><query></query><viewFields></viewFields><rowLimit>0</rowLimit><queryOptions><QueryOptions></QueryOptions></queryOptions></GetListItems></soapenv:Body></soapenv:Envelope>' "https://host.domain/sites/site/subsite/_vti_bin/Lists.asmx"
java中的curlerWS.sh
调用:
ArrayList<String> args = new ArrayList<String>();
args.add(new Finder().getEnv(YADA_BIN)+CURL_EXEC);
args.add("-X");
args.add("-s");
args.add(soapSource+soapPath);
args.add("-u");
args.add(soapDomain+"\\"+soapUser);
args.add("-p");
args.add(soapPass);
args.add("-a");
args.add(soapAuth);
args.add("-q");
args.add(soapData);
args.add("-t");
args.add(soapAction);
String[] cmds = args.toArray(new String[0]);
l.debug("Executing soap request via script: "+Arrays.toString(cmds));
String s = null;
try
{
ProcessBuilder pb = new ProcessBuilder(args);
l.debug(pb.environment().toString());
pb.redirectErrorStream(true);
Process p = pb.start();
BufferedReader si = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((s = si.readLine()) != null)
{
l.debug(s);
if(null == result)
{
result = "";
}
result += s;
}
si.close();
}
catch(IOException e)
{
String msg = "Unable to execute NTLM-authenticated SOAP call using system call to 'curl'. Make sure the curl executable is still accessible.";
throw new YADAAdaptorException(msg,e);
}
日志中报告的java args
数组值(第一次调用l.debug
)
Executing soap request via script: [/apps/bioinfo/dev/bin//curlerWS.sh, -X, -s, http://host.domain/sites/site/subsite/_vti_bin/Lists.asmx, -u, domain\user, -p, pass, -a, ntlm, -q, <GetListItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'><listName>{FAC53F9A-F7DC-4511-A675-F23B479C87CB}</listName><rowLimit>10000</rowLimit></GetListItems>, -t, http://schemas.microsoft.com/sharepoint/soap/GetListItems]
答案 0 :(得分:0)
经过对配置的几次迭代更改后,答案实际上是我的java代码做了一些错误。遗憾的是,我也是。
首先,SOAP请求的不同执行方法实际上并没有相同的配置。即:
shell和subshell版本完全相同。
但是,首先,java版本包含一个稍微修改过的soapBody版本。 正确的标记:
<GetListItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'><listName>{FAC53F9A-F7DC-4511-A675-F23B479C87CB}</listName><viewName></viewName><query></query><viewFields></viewFields><rowLimit>10</rowLimit><queryOptions><QueryOptions></QueryOptions></queryOptions></GetListItems>
原始标记:
<GetListItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'><listName>{FAC53F9A-F7DC-4511-A675-F23B479C87CB}</listName><rowLimit>10</rowLimit></GetListItems>
在各种分享点中排除viewFields
和queryOptions
时,我遇到了不同的结果。在这种情况下,包括它们,甚至是空的,似乎是必要的。排除它们会返回引用unexpected value
或其他类似内容的共享点错误。但是,当我注意到这种差异时,由于其他错误,我甚至没有达到这一点。
接下来,我注意到,在检查shell调用的跟踪输出时,网络服务器地址是指端口443
。通过在java调用中从主机配置中排除端口,java默认为使用80
协议无法访问的端口http
。
更正端口配置错误后,通过明确地将其设置为443
,卷曲响应不再是每次失败,而是返回,而不是空响应。
这是因为安全https
协议指定被重写为不安全。具体来说,https
在java调用中恢复为http
。
重构Java代码以保留https
是最终修复。我还能省略显式端口配置,因为使用https
,服务器从端口80重定向到443。
感谢您的意见和评论!