使用python suds模块从wsdl soap服务发送请求/返回响应

时间:2015-04-17 21:03:07

标签: javascript python web-services soap wsdl

我正在尝试使用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;

0 个答案:

没有答案