tutorial - mala solicitud cuando se usa python con espuma para compartir
para que sirve python (1)
Creo que reduje el problema y es específico para las suds (posiblemente otras implementaciones SOAP también). Tu viñeta:
- Las implementaciones SOAP tienen algunos problemas con el espacio en blanco en su nombre, incluso si se usa% 20 como reemplazo.
Eso es perfecto. Convertir el registro de depuración en suds me permitió tomar el punto final, el sobre y los encabezados. Imitar exactamente la misma llamada usando cURL devuelve una respuesta válida, pero jaja arroja la solicitud incorrecta.
El problema es que suds toma su WSDL (parámetro url) y lo analiza, pero no incluye la cadena URL codificada. Esto lleva a depurar mensajes como este:
DEBUG:suds.transport.http:opening (https://sub.site.com/sites/Site Collection with Spaces/_vti_bin/UserGroup.asmx?WSDL)
<snip>
TransportError: HTTP Error 400: Bad Request
Al pasar esta solicitud a través de un proxy de violín, se mostró que estaba ejecutando la solicitud contra la URL https://sub.site.com/sites/Site
debido a la forma en que analiza el WSDL. El problema es que no está pasando el parámetro de ubicación a suds.client.Client. El siguiente código me da respuestas válidas todo el tiempo:
from ntlm3 import ntlm
from suds.client import Client
from suds.transport.https import WindowsHttpAuthenticated
# URL without ?WSDL
url = ''https://sub.site.com/sites/Site%20Collection%20with%20Spaces/_vti_bin/Lists.asmx''
# Create NTLM transport handler
transport = WindowsHttpAuthenticated(username=''foo'',
password=''bar'')
# We use FBA, so this forces it to challenge us with
# a 401 so WindowsHttpAuthenticated can take over.
msg = ("%s//%s" % (''DOM'', ''foo''))
auth = ''NTLM %s'' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(msg).decode(''ascii'')
# Create the client and append ?WSDL to the URL.
client = Client(url=(url + "?WSDL"),
location=url,
transport=transport)
# Add the NTLM header to force negotiation.
header = {''Authorization'': auth}
client.set_options(headers=header)
Una advertencia: utilizar quote
de urllib
funciona, pero no puede codificar la URL completa o no reconoce la URL. Es mejor que solo hagas un reemplazo en espacios con% 20.
url = url.replace('' '',''%20'')
Espero que esto evite que alguien más golpee su cabeza contra la pared.
Estoy usando Suds para acceder a las listas de Sharepoint a través de jabón, pero estoy teniendo algunos problemas con el jabón malformado.
Estoy usando el siguiente código:
from suds.client import Client
from suds.sax.element import Element
from suds.sax.attribute import Attribute
from suds.transport.https import WindowsHttpAuthenticated
import logging
logging.basicConfig(level=logging.INFO)
logging.getLogger(''suds.client'').setLevel(logging.DEBUG)
ntlm = WindowsHttpAuthenticated(username=''somedomain//username'', password=''password'')
url = "http://somedomain/sites/somesite/someothersite/somethirdsite/_vti_bin/Lists.asmx?WSDL"
client = Client(url, transport=ntlm)
result = client.service.GetListCollection()
print repr(result)
Cada vez que ejecuto esto, obtengo el resultado Error 400 Bad request. Como tengo habilitada la depuración, puedo ver el sobre resultante:
<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns0:Body>
<ns1:GetListCollection/>
</ns0:Body>
</SOAP-ENV:Envelope>
... con este mensaje de error:
DEBUG:suds.client:http failed:
<!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</h2>
<hr><p>HTTP Error 400. The request is badly formed.</p>
</BODY></HTML>
Al ejecutar el mismo WSDL (y los datos del sobre sin procesar también) a través de SoapUI, la solicitud regresa con los valores esperados. ¿Alguien puede ver alguna razón obvia por la que obtengo los diferentes resultados con Suds como SoapUI y cómo puedo corregir esto?
ACTUALIZACIÓN: después de probar exactamente el mismo código en un sitio Sharepoint diferente (es decir, no un subsubsubsite con espacios en blanco en su nombre) y con Java (JAX-WS, que también tuvo problemas con el mismo sitio, sin embargo, diferentes problemas) aparece como si funciona como se esperaba Como resultado, me pregunto si uno de los dos detalles puede ser el motivo de estos problemas:
- Las implementaciones SOAP tienen algunos problemas con los subsubsubsites en Sharepoint?
- Las implementaciones SOAP tienen algunos problemas con el espacio en blanco en su nombre, incluso si se usa% 20 como reemplazo.
Todavía tengo la necesidad de utilizar la URL original con esos problemas, por lo que cualquier comentario sería muy apreciado. Supongo que, dado que SoapUI trabajó con la URL original, debería ser posible corregir lo que esté mal.