Skip to content

Instantly share code, notes, and snippets.

@sbaer
Created July 29, 2013 19:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save sbaer/6106865 to your computer and use it in GitHub Desktop.
Save sbaer/6106865 to your computer and use it in GitHub Desktop.
shapeways sample
"""Sample script that accesses the shapeways API
http://www.shapeways.com/api
"""
import wsdlprovider
wsdl_url = "http://api.shapeways.com/v1/wsdl.php"
username = "username"
password = "password"
application_id = "rhinotest"
assembly = wsdlprovider.GetWebservice(wsdl_url)
shapeways = assembly.SWwsdlService()
session_id = shapeways.login(username, password, application_id)
if session_id:
#get list of printers available
printers = shapeways.getPrinters(session_id, "", application_id)
if printers:
for printer in printers:
print "printer:", printer.title
for material in printer.materials:
print " - material ", material.title
'''
Generate a proxy class for a SOAP web service from its WSDL.
Based on C# implementation from the DynamicWebService IronPython example.
'''
# Original script from "IronPython in Action" Book code found at
# http://code.google.com/p/ironpython/
# http://www.voidspace.org.uk/ironpython/
# 2 June 2011 - S. Baer
# Modified to cache the generated assemblies for performance purposes
import clr
clr.AddReference("System.Web.Services")
clr.AddReference("System.Xml")
from System.Web.Services.Description import (
ServiceDescription, ServiceDescriptionImporter
)
from System.Web.Services.Protocols import SoapHttpClientProtocol
from System.IO import MemoryStream
from System.Net import WebClient
from System.CodeDom import (
CodeCompileUnit, CodeNamespace
)
from System.CodeDom.Compiler import CodeDomProvider, CompilerParameters
from System.Xml.Serialization import CodeGenerationOptions
def GetBytes(url):
'download the file at url'
return WebClient().DownloadData(url)
def CreateWebServiceFromWsdl(wsdl):
'convert the WSDL into an assembly containing the web service proxy classes'
# generate codeDom from wsdl
sd = ServiceDescription.Read(MemoryStream(wsdl))
importer = ServiceDescriptionImporter()
importer.ServiceDescriptions.Add(sd)
codeCompileUnit = CodeCompileUnit()
codeNamespace = CodeNamespace("")
codeCompileUnit.Namespaces.Add(codeNamespace)
importer.CodeGenerationOptions = (CodeGenerationOptions.GenerateNewAsync
| CodeGenerationOptions.GenerateOldAsync)
importer.Import(codeNamespace, codeCompileUnit)
# compile CodeDom into an assembly
provider = CodeDomProvider.CreateProvider("CS")
compilerParams = CompilerParameters()
compilerParams.GenerateInMemory = True
compilerParams.IncludeDebugInformation = False
results = provider.CompileAssemblyFromDom(compilerParams, codeCompileUnit)
generatedAssembly = results.CompiledAssembly
return generatedAssembly
# dictionary used to cache assemblies generated from wsdl
__assembly_cache = {}
def GetWebservice(url):
key = url.lower()
if not __assembly_cache.has_key(key):
'download the WSDL for the service URL and generate an assembly from it'
if url.lower().endswith(".asmx"): url += "?WSDL"
data = GetBytes(url)
assembly = CreateWebServiceFromWsdl(data)
if not assembly: return None
__assembly_cache[key] = assembly
return __assembly_cache[key]
def FindProxyType(assembly):
"""if you aren't sure of the name of the proxy type that will be generated,
use this to find it"""
for name in dir(assembly):
attr = getattr(assembly, name)
if type(attr) is type and issubclass(attr, SoapHttpClientProtocol):
return attr
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment