Python 使用套接字的免费 SOAP 服务客户端出现错误?
Python client for free SOAP service using socket giving error?
这是我正在尝试使用的代码:
import os
import socket
import httplib
packet='''
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<GetCitiesByCountry xmlns="http://www.webserviceX.NET">
<CountryName>India</CountryName>
</GetCitiesByCountry>
</soap12:Body>
</soap12:Envelope>'''
lent=len(packet)
msg="""
POST "www.webservicex.net/globalweather.asmx" HTTP/1.1
Host: www.webservicex.net
Content-Type: application/soap+xml; charset=utf-8
Content-Length: {length}
SOAPAction:"http://www.webserviceX.NET/GetCitiesByCountry"
Connection: Keep-Alive
{xml}""".format(length=lent,xml=packet)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect( ("www.webservicex.net",80) )
if bytes != str: # Testing if is python2 or python3
msg = bytes(msg, 'utf-8')
client.send(msg)
client.settimeout(10)
print(client.type)
res=client.recv(4096)
print(res)
#res = res.replace("<","<") -- only for stack overflow post
#res = res.replace(">",">") -- only for stack overflow post
输出为:
HTTP/1.1 400 Bad Request
Content-Type: text/html; charset=us-ascii
Server: Microsoft-HTTPAPI/2.0
Date: Wed, 24 Aug 2016 11:40:02 GMT
Connection: close
Content-Length: 324
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">;
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid URL</h2>
<hr><p>HTTP Error 400. The request URL is invalid.</p>
</BODY></HTML>
有什么想法吗?
您应该使用 suds 来使用 SOAP 网络服务。
编辑:示例
import suds
import suds.transport
from suds.transport.http import HttpAuthenticated
class MyException(Exception):
pass
service_url = "http://my/service/url"
获取可用服务:
try:
transport = HttpAuthenticated(username='elmer', password='fudd')
wsdl = suds.client.Client(service_url, faults=False, transport=transport)
except IOError as exc:
fmt = "Can initialize my service: {reason}"
raise MyException(fmt.format(reason=exc))
except suds.transport.TransportError as exc:
fmt = "HTTP error -- Is it a bad URL: {service_url}? {reason}"
raise MyException(fmt.format(service_url=service_url, raison=exc))
运行 一个给定的服务(这里,它的名字是 运行Script):
# add required options in headers
http_headers = {'sessionID': 1}
wsdl.set_options(soapheaders=http_headers)
params = {"scriptLanguage": "javascript", "scriptFile": "...",
"scriptArgs": [{"name": "...", "value": "..."}]}
try:
exit_code, response = wsdl.service.RunScript([params])
# ...
except suds.MethodNotFound as reason:
raise MyException("No method found: {reason}".format(reason=reason))
except suds.WebFault as reason:
raise MyException("Error running the script: {reason}".format(reason=reason))
except Exception as reason:
err_msg = "{0}".format(reason)
if err_msg == "timed out":
raise MyException("Timeout: {reason}".format(reason=reason))
raise
当然,这里不需要使用错误管理器。但是我举个例子。最后一个 "timed out" 是我用来检测应用程序超时的一种 hack。
这是我正在尝试使用的代码:
import os
import socket
import httplib
packet='''
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<GetCitiesByCountry xmlns="http://www.webserviceX.NET">
<CountryName>India</CountryName>
</GetCitiesByCountry>
</soap12:Body>
</soap12:Envelope>'''
lent=len(packet)
msg="""
POST "www.webservicex.net/globalweather.asmx" HTTP/1.1
Host: www.webservicex.net
Content-Type: application/soap+xml; charset=utf-8
Content-Length: {length}
SOAPAction:"http://www.webserviceX.NET/GetCitiesByCountry"
Connection: Keep-Alive
{xml}""".format(length=lent,xml=packet)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect( ("www.webservicex.net",80) )
if bytes != str: # Testing if is python2 or python3
msg = bytes(msg, 'utf-8')
client.send(msg)
client.settimeout(10)
print(client.type)
res=client.recv(4096)
print(res)
#res = res.replace("<","<") -- only for stack overflow post
#res = res.replace(">",">") -- only for stack overflow post
输出为:
HTTP/1.1 400 Bad Request
Content-Type: text/html; charset=us-ascii
Server: Microsoft-HTTPAPI/2.0
Date: Wed, 24 Aug 2016 11:40:02 GMT
Connection: close
Content-Length: 324
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">;
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid URL</h2>
<hr><p>HTTP Error 400. The request URL is invalid.</p>
</BODY></HTML>
有什么想法吗?
您应该使用 suds 来使用 SOAP 网络服务。
编辑:示例
import suds
import suds.transport
from suds.transport.http import HttpAuthenticated
class MyException(Exception):
pass
service_url = "http://my/service/url"
获取可用服务:
try:
transport = HttpAuthenticated(username='elmer', password='fudd')
wsdl = suds.client.Client(service_url, faults=False, transport=transport)
except IOError as exc:
fmt = "Can initialize my service: {reason}"
raise MyException(fmt.format(reason=exc))
except suds.transport.TransportError as exc:
fmt = "HTTP error -- Is it a bad URL: {service_url}? {reason}"
raise MyException(fmt.format(service_url=service_url, raison=exc))
运行 一个给定的服务(这里,它的名字是 运行Script):
# add required options in headers
http_headers = {'sessionID': 1}
wsdl.set_options(soapheaders=http_headers)
params = {"scriptLanguage": "javascript", "scriptFile": "...",
"scriptArgs": [{"name": "...", "value": "..."}]}
try:
exit_code, response = wsdl.service.RunScript([params])
# ...
except suds.MethodNotFound as reason:
raise MyException("No method found: {reason}".format(reason=reason))
except suds.WebFault as reason:
raise MyException("Error running the script: {reason}".format(reason=reason))
except Exception as reason:
err_msg = "{0}".format(reason)
if err_msg == "timed out":
raise MyException("Timeout: {reason}".format(reason=reason))
raise
当然,这里不需要使用错误管理器。但是我举个例子。最后一个 "timed out" 是我用来检测应用程序超时的一种 hack。