我现在遇到了麻烦。
我尝试使用R进行SOAP数据交换,但始终让服务器响应如下:
尝试210.242.163.56 ......
连接至210.242.163.56(210.242.163.56)端口80(#0)
POST / SendDigXml / HTTP / 1.1
主持人:210.242.163.56
接受:text / xml
接受:multipart / *
Content-Type:text / xml;字符集= UTF-8
SOAPAction:http://210.242.163.56/SendDigXml/GetLastMod
内容长度:397
上传已完全发送:397个字节中的397个
< HTTP / 1.1 500内部服务器错误
<缓存控制:私有
< Content-Type:text / xml;字符集= UTF-8
<服务器:Microsoft-IIS / 7.5
< X-AspNet-Version:4.0.30319
< X-Powered-By:ASP.NET
<日期:2016年11月1日星期二06:32:54 GMT
<内容长度:441
<连接:Keep-Alive
<年龄:0
< 连接#0到主机210.242.163.56保持不变
faulcode和faultstring是:
<faultcode>soap:Client</faultcode>
<faultstring>The server could not recognize the value of the HTTP header SOAPAction: http://210.242.163.56/SendDigXml/GetLastMod/.</faultstring>
我在RCurl包中使用curlPerform函数,代码如下:
library(RCurl)
id ="iamuser"
pw ="letmepass"
headerFields =
c(Accept = "text/xml",
Accept = "multipart/*",
'Content-Type' = "text/xml; charset=utf-8",
SOAPAction = "http://210.242.163.56/SendDigXml/GetLastMod")
body = sprintf('<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetLastMod xmlns="http://210.242.163.56/SendDigXml/">
<user_id>%s</user_id>
<password>%s</password>
<county_code>%s</county_code>
<data_type>%s</data_type>
</GetLastMod>
</soap:Body></soap:Envelope>',id,pw,"Y","1")
reader = basicTextGatherer()
getupdate<-curlPerform(url = "http://210.242.163.56/SendDigXml/",
httpheader = headerFields,
postfields = body,
writefunction = reader$update,
verbose = TRUE)
SOAPAction的值格式是按照模板的规定,也尝试了其他几种表示,但结果是一样的。我不知道还能尝试什么。有人能帮助我吗?
感谢您的时间。
答案 0 :(得分:0)
好的,我发现了什么是错的。
SOAPAction应该是"http://tempuri.org/GetLastMod"
,而不是"http://210.242.163.56/SendDigXml/GetLastMod"
。
和<GetLastMod xmlns="http://210.242.163.56/SendDigXml/">
应为<GetLastMod xmlns="http://tempuri.org/">
与http://210.242.163.56/SendDigXml上的示例代码相同。
我认为这是一个错误,任何训练有素的程序员都不会这样做。但我没有训练过程员...我会保留这个问题而不是删除它。我希望它可以帮助像我这样的人。