Soap を介して Sharepoint リストにアクセスするために Suds を使用していますが、不正な形式の SOAP に問題があります。
次のコードを使用しています。
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)
これを実行するたびに、エラー 400 Bad request という結果が表示されます。デバッグを有効にしているので、結果のエンベロープを確認できます。
<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>
...次のエラー メッセージが表示されます。
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>
SoapUI を介して同じ WSDL (および生のエンベロープ データも) を実行すると、要求は期待どおりの値で返されます。Suds を SoapUI として使用すると異なる結果が得られる明白な理由と、これを修正する方法を誰でも見ることができますか?
更新:別のSharepointサイト(つまり、名前に空白が含まれるサブサブサブサイトではない)とJava(JAX-WS、同じサイトでも問題がありましたが、別の問題)でまったく同じコードをテストした後、次のように表示されます期待どおりに動作します。その結果、次の 2 つの詳細のいずれかがこれらの問題の原因ではないかと考えています。
- SOAP 実装には、Sharepoint のサブサブサブサイトに関するいくつかの問題がありますか?
- SOAP 実装では、代わりに %20 を使用している場合でも、名前に空白があることに問題がありますか?
これらの問題で元の URL を使用する必要があるため、ご意見をいただければ幸いです。SoapUI は元の URL で動作したため、問題があれば修正できるはずです。