Kennen Sie die SOAP-API? Wenn Sie eine API erstellen, erstellen wir sie mit der SOAP-API! Dies ist selten der Fall, aber je nach verwendetem Dienst wird die SOAP-API selten bereitgestellt (persönlicher Eindruck). In diesem Artikel möchte ich Ihnen einen Überblick über die SOAP-API geben und Ihnen Zeep, den SOAP-API-Client von Python, vorstellen.
SOAP API SOAP Das Simple Object Access Protocol (SOAP) ist ein Protokoll, das Internet-Standardtechnologien wie HTTP und XML verwendet.
WSDL Web Services Description Language (WSDL) ist eine Schnittstellenbeschreibungssprache für in XML geschriebene Webdienste. Gemäß dem folgenden Artikel (https://www.atmarkit.co.jp/ait/articles/0303/18/news003.html) wird der Code für das Webdienstmodul generiert, wenn das Entwicklungstool das WSDL-Dokument liest. Scheint erwartet worden zu sein
Die Sponsord Search-API von Yahoo ist eine SOAP-API, daher möchte ich diese in Python schreiben.
Das Beispiel ist auch PHP oder Java, also sieht es gut aus
Zeep
Verwenden wir sofort Zeep Erstellen Sie ein Zeep-Clientobjekt, indem Sie die WSDL-URL angeben. Geben wir als Beispiel "Account Service" an
import zeep
client = zeep.Client(wsdl='https://ss.yahooapis.jp/services/V201901/AccountService?wsdl')
Informationen, die aus der WSDL gelesen werden können, werden dem erstellten Objekt hinzugefügt, und eine Methode, die den vom Endpunkt verfügbaren Aufruf aufruft, wird ebenfalls hinzugefügt.
>>> dir(client.service)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__self_class__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__thisclass__', 'get', 'mutate']
Überprüfen Sie als Nächstes die Argumente, die in WSDL an die Methode übergeben werden sollen. Überprüfen Sie zunächst den Header, der an die SOAP-API übergeben werden soll. Das Element "minOccurs = 1" ist erforderlich. Geben Sie es daher unbedingt an.
<complexType name="SoapHeader">
<sequence>
<element maxOccurs="1" minOccurs="1" name="license" type="xsd:string"/>
<element maxOccurs="1" minOccurs="1" name="apiAccountId" type="xsd:string"/>
<element maxOccurs="1" minOccurs="1" name="apiAccountPassword" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="accountId" type="xsd:long"/>
<element maxOccurs="1" minOccurs="0" name="onBehalfOfAccountId" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="onBehalfOfPassword" type="xsd:string"/>
</sequence>
</complexType>
header = {
"RequestHeader": {
"license": <LICENSE>,
"apiAccountId": <API_ACCOUNT_ID>,
"apiAccountPassword": <API_ACCOUNT_PASSWORD>
}
}
Überprüfen Sie als Nächstes die erforderlichen Argumente für die Methode get. Sie müssen selecter
angeben, aber es scheint, dass Sie die Elemente in selector
nicht angeben müssen
<element name="get">
<complexType>
<sequence>
<element maxOccurs="1" minOccurs="1" name="selector" type="tns:AccountSelector"/>
</sequence>
</complexType>
</element>
<complexType name="AccountSelector">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="accountIds" type="xsd:long"/>
<element maxOccurs="unbounded" minOccurs="0" name="accountTypes" type="tns:AccountType"/>
<element maxOccurs="unbounded" minOccurs="0" name="accountStatuses" type="tns:AccountStatus"/>
<element maxOccurs="1" minOccurs="0" name="paging" type="adv:Paging"/>
</sequence>
</complexType>
request = {
"selector": {}
}
Nachdem wir nun die Argumente haben, die an die Methode übergeben werden sollen, können wir die Methode aufrufen. Wenn wir jedoch auf die WSDL zurückblicken, sehen wir die folgende Beschreibung. Sie müssen das Endpunktpräfix von "Location Service" abrufen und die Endpunkte wechseln. Da der Standortdienst jedoch die Konto-ID als Argument angeben muss, ist der Standortdienst nicht bekannt, wenn der Kontodienst zum Abrufen der Konto-ID-Liste verwendet wird. Sie können `nicht verwenden. Geben Sie daher einen festen Wert an
<wsdl:service name="AccountService">
<wsdl:port binding="tns:AccountServiceSoapBinding" name="AccountService">
<wsdlsoap:address location="https://USE_ADDRESS_RETURNED_BY_LOCATION_SERVICE/services/V201901/AccountService"/>
</wsdl:port>
</wsdl:service>
In Zeep können Sie den Endpunkt des Clientobjekts mithilfe der Methode "create_service" der Klasse "Client" wechseln. Es scheint gut, zwischen der Produktumgebung und der Sandboxumgebung zu wechseln oder sich mit der Testumgebung zu verbinden.
service = client.create_service(
'{http://ss.yahooapis.jp/V201901/Account}AccountServiceSoapBinding',
'https://ss.yahooapis.jp/services/V201901/AccountService'
)
Nachdem Sie die erforderlichen Vorbereitungen getroffen haben, verwenden Sie "get", um die "Account ID" -Liste abzurufen. Dies sind die Elemente, die mit WSDL überprüft werden müssen, wenn die SOAP-API aufgerufen wird.
response = service.get(**request, _soapheaders=header)
In "Account Service" wird der Endpunkt mit einem festen Wert umgeschaltet, in anderen Diensten wird er auf den vom "Location Service" erfassten Endpunkt umgeschaltet. Wenn Sie beispielsweise "Campaign Service" verwenden möchten, führen Sie die folgenden Schritte aus.
location_client = zeep.Client(wsdl='https://ss.yahooapis.jp/services/V201901/LocationService?wsdl')
location_request = {
"accountId": "{}".format(account_id)
}
res_location_service = location_client.service.get(**location_request, _soapheaders=header)
url_prefix = res_location_service['body']['rval']['value']
campaign_client = zeep.Client(wsdl='https://ss.yahooapis.jp/services/V201901/CampaignService?wsdl')
campaign_request = {
"selector": {
"accountId": "{}".format(account_id)
}
}
campaign_service = campaign_client.create_service(
'{http://ss.yahooapis.jp/V201901/Campaign}CampaignServiceSoapBinding',
'https://{}/services/V201901/CampaignService'.format(url_prefix)
)
response_campaign_reports = campaign_service.get(**campaign_request, _soapheaders=header)
Als Artikel wurde es eher zu einer Erklärung von WSDL als zu einer Einführung von Python und Zeep ... Ich hatte das Gefühl, dass es schwierig war zu verstehen, welche als Client-Bibliothek der SOAP-API gut ist, daher war es eine Gelegenheit, Zeep bei der Verwendung von Python in Betracht zu ziehen. Ich bin froh wenn
Recommended Posts