使用 Python 访问 SOAP 服务时出现问题

Issues Accessing SOAP service with Python

我正在尝试访问 NJTransit API,我已使用 Postman 应用程序成功查询它,但无论我尝试什么,我都无法 python 成功 return 想要的询问。 使用肥皂水:

from suds.client import Client
url = "http://traindata.njtransit.com:8090/NJTTrainData.asmx?wsdl"
client = Client(url, cache = None)
from suds.sax.element import Element
auth = Element('UserCredentials')
auth.append(Element('userName').setText(my_username))
auth.append(Element('password').setText(my_password))
client.set_options(soapheaders = auth)
client = Client(url, cache = None)
result = client.service.getTrainScheduleJSON("NY")

这导致 "none"。

我也曾尝试使用 Postman 应用建议的预格式化请求,但我一直收到 404 错误。

import requests

url = "http://traindata.njtransit.com:8090/NJTTrainData.asmx"

querystring = {"wsdl":""}

payload = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<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/\">\n  <soap:Header>\n    <UserCredentials xmlns=\"http://microsoft.com/webservices/\">\n      <userName>---</userName>\n      <password>---</password>\n    </UserCredentials>\n  </soap:Header>\n  <soap:Body>\n      <getTrainScheduleJSON xmlns=\"http://microsoft.com/webservices/\">\n      <station>NY</station>\n    </getTrainScheduleJSON>\n  </soap:Body>\n</soap:Envelope>"
headers = {
    'content-type': "text/xml; charset=utf-8",
    'host': "traindata.njtransit.com",
    'soapaction': "http//microsoft.com/webservices/getTrainScheduleJSON"
    }

response = requests.request("POST", url, data=payload, headers=headers, params=querystring)

print(response.text)

我将不胜感激 help/insight。

您永远不想设置 "Host" header,这将由请求完成。

404 是由错误的 SOAPAction 触发的。 http 之后少了一个 : 。

以下代码片段对我来说工作正常。

import requests

url = "http://traindata.njtransit.com:8090/NJTTrainData.asmx"

querystring = {"wsdl":""}

payload = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<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/\">\n  <soap:Header>\n    <UserCredentials xmlns=\"http://microsoft.com/webservices/\">\n      <userName>---</userName>\n      <password>---</password>\n    </UserCredentials>\n  </soap:Header>\n  <soap:Body>\n      <getTrainScheduleJSON xmlns=\"http://microsoft.com/webservices/\">\n      <station>NY</station>\n    </getTrainScheduleJSON>\n  </soap:Body>\n</soap:Envelope>"
headers = {
    'content-type': "text/xml; charset=utf-8",
    'soapaction': 'http://microsoft.com/webservices/getTrainScheduleJSON'
}

response = requests.request("POST", url, data=payload, headers=headers, params=querystring)

print response
print(response.text)