我正在尝试使用python suds模块向soap服务发送请求并检索结果,但我不确定如何输入我想要调用的方法的参数。我已成功访问该服务并检索显示参数和数据类型的方法,但我没有幸运获得我尝试发送请求的响应。我是新手,所以不确定我做错了什么。我收到此错误:suds.WebFault: Server raised fault: 'java.rmi.RemoteException'
在启动响应的行上。我怀疑我没有正确输入该方法的参数,但我不清楚如何修改它。我想调用getPostmileForPoint
方法。这就是我到目前为止所做的:
import suds
from suds.client import Client
url = 'http://geo.dot.ca.gov/services/PostmileWebService?wsdl'
client = Client(url)
response = client.service.getPostmileForPoint(inputPoint=[None,None,-119.509444,36,None],options=None,routeAlignment='R',routeNumber=43,routeSuffixCode=None)
print response
我使用下面的代码查找服务中的方法及其所需的参数:
for service in client.wsdl.services:
for port in service.ports:
methods = port.methods.values()
for method in methods:
print(method.name)
for part in method.soap.input.body.parts:
part_type = part.type
if(not part_type):
part_type = part.element[0]
print(' ' + str(part.name) + ': ' + str(part_type))
o = client.factory.create(part_type)
print(' ' + str(o))
我使用此代码获取有关我要调用的方法的参数的更多详细信息:
method = client.wsdl.services[0].ports[0].methods["getPostmileForPoint"]
params = method.binding.input.param_defs(method)
print params
更新 我在网页上找到了一个javascript函数,该函数使用我想要使用的方法的输入参数调用Web服务。我现在想知道如何使用suds将其转换为python(我只包含我认为需要的函数中的代码,其余部分将结果添加到网页中):
function getPostmile()
{
var outputDiv = document.getElementById('latLongResult');
var popupHtml = null;
var req = new revPMRequest();
var pt = new lrspoint();
pt.x = parseFloat(document.InputCoordinates.InputX.value);
pt.y = parseFloat(document.InputCoordinates.InputY.value);
pt.spatialReferenceID=4269;//NAD83
var opt = new revPMOptions();
opt.toleranceDegrees=0.01703; //~1 mile
req.inputPoint = pt;
req.options = opt;
var ws = new GISWebServiceSoapImp();
var res = ws.getPostmileForPoint(req);
var pm = res.outputPostmile;